FORMAT
La función FORMAT da formato a un número añadiéndole separadores de miles y fijando un número concreto de decimales, devolviendo el resultado como una cadena de texto. Aunque opera sobre números, se clasifica entre las funciones de cadena porque su salida es texto, y ese es justamente el detalle más importante que hay que entender para no usarla mal.
FORMAT está pensada para la presentación: convierte un valor como 1234567.891 en algo legible como 1,234,567.89. Es ideal para mostrar precios, totales o cantidades en informes y volcados por consola. Pero precisamente porque devuelve una cadena con comas, no debe emplearse en cálculos ni para ordenar numéricamente. En este artículo veremos su sintaxis, el redondeo, el formato regional mediante locales y los errores típicos derivados de olvidar que el resultado es texto.
Sintaxis
FORMAT recibe el número y la cantidad de decimales, y de forma opcional un locale que determina los separadores según la convención de cada país.
FORMAT(numero, decimales)
FORMAT(numero, decimales, locale)Los argumentos tienen este significado:
decimales: número de posiciones decimales que se mostraránlocale(opcional): convención regional de formato (por defecto'en_US')
Ejemplo básico
En su uso más simple, formatea el número con separadores de miles y los decimales indicados. Aquí se muestra con dos decimales:
SELECT FORMAT(1234567.891, 2) AS resultado;| resultado |
|---|
| 1,234,567.89 |
Si se piden cero decimales, FORMAT redondea al entero más cercano, no trunca. Observa cómo .891 redondea hacia arriba:
SELECT FORMAT(1234567.891, 0) AS sin_decimales;| sin_decimales |
|---|
| 1,234,568 |
Formatear precios de productos
El uso más típico es presentar importes monetarios. Combinando FORMAT con CONCAT para anteponer el símbolo de moneda, se obtienen precios listos para mostrar:
SELECT
nombre,
precio,
CONCAT('$', FORMAT(precio, 2)) AS precio_formateado
FROM productos
LIMIT 5;| nombre | precio | precio_formateado |
|---|---|---|
| iPhone 15 Pro | 1299.99 | $1,299.99 |
| MacBook Air M2 | 1199.99 | $1,199.99 |
| AirPods Pro | 249.99 | $249.99 |
| iPad Air | 599.99 | $599.99 |
| Apple Watch Series 9 | 399.99 | $399.99 |
Total de ventas formateado
FORMAT se aplica igual de bien sobre el resultado de funciones de agregación. Aquí se formatea la suma total de ventas con símbolo de moneda y se usa COUNT para el número de pedidos:
SELECT
CONCAT('$', FORMAT(SUM(total), 2)) AS ventas_totales,
FORMAT(COUNT(*), 0) AS num_pedidos
FROM pedidos;Formato regional (locale)
El tercer argumento adapta los separadores a la convención de cada país, algo esencial en aplicaciones internacionales. En inglés el punto separa los decimales y la coma los miles, mientras que en español y alemán es justo al revés:
SELECT
FORMAT(1234567.89, 2, 'en_US') AS ingles,
FORMAT(1234567.89, 2, 'de_DE') AS aleman,
FORMAT(1234567.89, 2, 'es_ES') AS espanol;| ingles | aleman | espanol |
|---|---|---|
| 1,234,567.89 | 1.234.567,89 | 1.234.567,89 |
Usar el locale correcto evita confusiones graves: un usuario español podría leer 1,234 como "algo más de mil" cuando en formato inglés significa exactamente eso, pero en formato español significaría 1,234 unidades, es decir, poco más de uno.
FORMAT devuelve una cadena
Este es el punto crítico de la función. El resultado es un VARCHAR, no un número, y contiene comas que no son válidas en aritmética. Por eso no debe usarse en cálculos; lo correcto es hacer las operaciones con el número y aplicar FORMAT solo al final, para presentar:
-- Esto no funciona de forma fiable para cálculos
SELECT FORMAT(1000, 2) + 1;
-- Mejor: calcular primero y formatear solo para presentación
SELECT FORMAT(precio * 1.21, 2) AS precio_con_iva
FROM productos
WHERE id = 1;| precio_con_iva |
|---|
| 1,572.99 |
FORMAT con NULL y valores pequeños
Si el número es NULL, el resultado es NULL:
SELECT FORMAT(NULL, 2) AS resultado;| resultado |
|---|
| NULL |
Con valores pequeños, FORMAT rellena con ceros hasta completar los decimales pedidos, lo que garantiza una presentación uniforme (por ejemplo, todos los precios con dos decimales aunque sean exactos):
SELECT
FORMAT(0.5, 2) AS medio,
FORMAT(0.001, 4) AS milesima,
FORMAT(42, 2) AS entero;| medio | milesima | entero |
|---|---|---|
| 0.50 | 0.0010 | 42.00 |
Errores comunes
El error más grave es ordenar por una columna formateada con FORMAT. Como el resultado es texto, el ORDER BY lo ordena alfabéticamente y no por valor: '1,000' aparecería antes que '900' porque el carácter '1' es menor que '9'. La ordenación debe hacerse siempre sobre el número original, aplicando FORMAT solo a la columna que se muestra.
El segundo descuido es no especificar el locale en aplicaciones internacionales y asumir el formato inglés por defecto, lo que produce números que el usuario malinterpreta. Si tu público espera la convención española, indícalo explícitamente con 'es_ES'.
Cuándo usar FORMAT
FORMAT es la herramienta adecuada para el último paso de presentación de un número: mostrar precios, totales o cantidades de forma legible con separadores y decimales fijos. Nunca debe intervenir en cálculos ni en ordenaciones numéricas; para eso se trabaja con el valor numérico original y funciones como ROUND o TRUNCATE.
Con esto completamos la sección de funciones de cadena. En la siguiente sección exploraremos las funciones numéricas de MySQL, como ROUND y TRUNCATE.
Escrito por Eduardo Lázaro
