money_format()
Aprende sobre la función money_format() de PHP, usada para formatear números como cadenas de moneda. Función obsoleta desde PHP 7.4 y eliminada en PHP 8.
La función money_format() formatea un número como una cadena de moneda, aplicando un separador de miles, un punto decimal y un símbolo de moneda según la configuración regional activa.
Importante: money_format() está obsoleta desde PHP 7.4 y eliminada en PHP 8.0. Además, nunca existió en Windows. Si estás escribiendo código nuevo, ve directamente a la sección Reemplazo moderno que aparece más abajo — el resto de esta página documenta la función heredada para que puedas leer y mantener código PHP antiguo.
Syntax
string money_format ( string $format , float $number )La función acepta dos parámetros:
$format– una cadena que describe cómo formatear el número. Contiene una o más especificaciones de conversión (cada una comenzando con%), de manera similar asprintf(). Cualquier texto fuera de una especificación se imprime literalmente.$number– el valor numérico a formatear.
Devuelve la cadena formateada.
Especificadores de formato habituales
| Especificador | Significado | Ejemplo de salida (en_US, 1234.56) |
|---|---|---|
%n | Formato de moneda nacional (local) | $1,234.56 |
%i | Formato de moneda internacional | USD 1,234.56 |
%.2n | Formato nacional con 2 decimales | $1,234.56 |
%(n | Encierra los importes negativos entre paréntesis | ($1,234.56) |
%!n | Suprime el símbolo de moneda | 1,234.56 |
La configuración regional (establecida con setlocale()) determina qué símbolo de moneda, carácter de agrupación y punto decimal se utilizan.
Ejemplo
<?php
$number = 1234.56;
setlocale(LC_MONETARY, 'en_US');
echo money_format('%n', $number);
?>Aquí $number almacena un valor de punto flotante, y la llamada a setlocale() configura la configuración regional monetaria a en_US. La salida es:
$1,234.56Aviso: setlocale() devuelve false si la configuración regional solicitada no está instalada en el servidor, y money_format() recurre silenciosamente a un valor predeterminado. Siempre verifica que el nombre de la configuración regional (por ejemplo, en_US frente a en_US.UTF-8) realmente exista en tu sistema.
Reemplazo moderno: NumberFormatter
Dado que money_format() desapareció en PHP 8, el enfoque recomendado es la clase NumberFormatter de la extensión intl. Es consciente de la configuración regional, funciona en todas las plataformas (incluido Windows) y utiliza datos ICU en lugar de la configuración regional del sistema:
<?php
$number = 1234.56;
$formatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
echo $formatter->formatCurrency($number, 'USD');
?>Salida:
$1,234.56Para formatear el mismo importe con una configuración regional y moneda diferentes, basta con cambiar la configuración regional del constructor y el código de moneda:
<?php
$number = 1234.56;
$de = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
echo $de->formatCurrency($number, 'EUR');
?>Salida (la agrupación alemana usa un punto para los miles y una coma para los decimales):
1.234,56 €Cuándo usar cada opción
- Código nuevo: usa
NumberFormatter::formatCurrency()— es el único formateador de moneda disponible en PHP 8+. - Código heredado en PHP 7.4 o anterior:
money_format()aún funciona pero emitirá un aviso de obsolescencia; planifica la migración. - Números simples sin moneda: si solo necesitas un separador de miles y decimales fijos (sin símbolo de moneda ni reglas de configuración regional),
number_format()es más ligero.
Funciones relacionadas
number_format()– formatea un número con miles agrupados.setlocale()– establece la configuración regional utilizada pormoney_format()y otras funciones sensibles a la configuración regional.sprintf()/printf()– formateo de cadenas de propósito general.round()– redondea un valor antes de formatearlo como moneda.