Novedades en PHP7.4: money_format() ya no está diponible

¡Noooo! Nuestra querida función money_format() ya no está disponible en PHP7.4.

¿Y a que lo has descubierto de la forma dura? ¡Con un error en producción! Algo como ésto:

ERROR: Function money_format() is deprecated

Por estas cosas es por lo que hay que estar al día de las «deprecaciones» y no ignorarlas. Puedes evitar estos errores desactivándolos pero no suele ser una buena idea.

Vale, vale, pero ¿cómo lo arreglo?

Bueno, no pasa nada, a todos nos ha ocurrido. Lo importante es que ahora hay que arreglarlo. Esta es la forma rápida; Sustituye los:

money_format("%i", $numero);

por esto otro:

NumberFormatter::create( 'es_ES', NumberFormatter::DECIMAL )->format($numero);

En realidad no necesitas usar este NumberFormat, es solo una de las opciones. Yo te la recomiendo porque es la que recomiendan oficialmente desde PHP:

The money_format() function is deprecated. It can be replaced by the intl NumberFormatter functionality.

¡Y ahora Class ‘NumberFormatter’ not found!

Si te sale este error estarás pensado que esto va a seguir empeorando antes de empezar a mejorar. Paciencia, si ves este error es porque no tienes instalada la extensión «intl» de PHP. Se soluciona instalando este paquete. Por ejemplo (dependerá de tu servidor, yo te pongo cómo se hace en Ubuntu 18.04):

$ sudo apt install php7.4-intl

¿Ya lo tienes solucionado?

¿Qué es eso de NumberFormatter?

Es una clase disponible desde la versión 5.3 de PHP así que ya va siendo hora de usarla :). Aquí te dejo la documentación oficial. Pero si quieres te lo cuento aquí de forma más divertida:

Puedes usarlo como si fuera un objeto normal y corriente:

<?php

$numero = 12932.203;

$formateador = new NumberFormatter( 'es_ES', NumberFormatter::DECIMAL );

echo $formateador->format($numero) . PHP_EOL;

O también puedes usar el método estático create() que crea y devuelve un objeto NumberFormatter:

echo NumberFormatter::create( 'es_ES', NumberFormatter::DECIMAL )->format($numero) . PHP_EOL;

Pero si eres más «procedural» también tienes esta otra opción. Aquí usamos la función nmfmt_create que nos devuelve un objeto NumberFormatter:

$formateador = numfmt_create( 'es_ES', NumberFormatter::DECIMAL );

echo $formateador->format($numero) . PHP_EOL;

Y si ya eres «procedural» a muerte aquí tienes otra opción más:

$formateador = numfmt_create( 'es_ES', NumberFormatter::DECIMAL );

echo numfmt_format($formateador, $numero) . PHP_EOL;

¿Qué parámetros tiene NumberFormatter?

¡Mira qué buena pregunta! En realidad era solo por animarte, es una pregunta normalita. La definición del constructor es la siguiente:

public NumberFormatter::__construct ( string $locale , int $style [, string $pattern ] )

Tenemos tres parámetros:

  • $locale. Aquí debes usar tu «locale». Dependiendo de tu zona variará. En España seguramente usarás «es_ES».
  • $style. Aquí tienes una larga lista de los posibles valores.
  • $pattern. Este parámetro solo es necesario si usas los valores NumberFormatter::PATTERN_DECIMAL o NumberFormatter::PATTERN_RULEBASED en $style. La verdad es que me da un poco de pereza meterme aquí. Te lo dejo a tí si te interesa.

¿Y si quiero mostrarlo en formato moneda (con euros)?

Vale, seguramente ibas buscando esto. En ese caso deberás usar el estilo:

echo NumberFormatter::create( 'es_ES', NumberFormatter::CURRENCY )->format($numero) . PHP_EOL;

Que te mostrará el valor algo así:

12.932,20 €

Me siento solo, dime algo...