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.


¿Sabes lo que es el reto de PHP?

He creado el PHP Journey, una plataforma para que recibas de forma gratuita un email cada día con una pequeña perla de sabiduría de PHP y una pregunta que deberás responder.

Cada día pones a prueba tus conocimientos y aprendes algo nuevo.

Apúntate aquí:

https://urlantools.urlanheat.com/newsletter/php-journey/subscribe


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 €

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

  1. Hola! Tengo problemas con mi sitio web porque en las imágenes de mi inicio aparecen unos links «Function money_format() is deprecated in….»

    ¿Me podrías ayudar cómo resolver esto?

    Responder
    • Hola Laura, puedes hacer dos cosas:

      1) Reemplazar todas las apariciones de money_format() por NumberFormatter.

      2) Modificar la configuración de tu servidor para que no muestre los warnings (esto sería un parche porque cuando actualices PHP se convertirá en un error).

      Responder

Responder a Daniel Gutiérrez Cancelar la respuesta