logo oujood
🔍

Fonction money_format() PHP : Formatage monétaire et alternatives modernes

Guide technique complet sur le formatage monétaire en PHP : de money_format() (dépréciée) aux solutions modernes avec NumberFormatter et l'extension intl.

OUJOOD.COM

La fonction money_format() en PHP

PHP — Référence des fonctions de chaînes de caractères

⚠️ Mise à jour 2026 : money_format() est dépréciée depuis PHP 7.4 et supprimée en PHP 8.0. Cette page documente son fonctionnement historique et propose des alternatives modernes avec NumberFormatter (extension intl), recommandées pour tout nouveau développement PHP.

Disponibilité historique : PHP 4 >= 4.3.0, PHP 5, PHP 7 (dépréciée 7.4)

Définition et utilisation

La fonction money_format() permettait de formater un nombre selon les conventions monétaires d'une locale (pays/langue). Elle s'appuyait sur la fonction C strfmon() du système d'exploitation, ce qui la rendait indisponible sous Windows et dépendante de la configuration locale du serveur.

Son principe : insérer dans une chaîne de format le nombre formaté à la position d'un spécificateur de conversion précédé du signe %.

Syntaxe
money_format(string $format, float $nombre): string
ParamètreDescription

format

Requis. Chaîne contenant un spécificateur de format monétaire constitué des éléments suivants, dans l'ordre :

  • Un caractère % (obligatoire, déclencheur)
  • Des drapeaux optionnels (comportement de formatage)
  • Une taille de champ minimale optionnelle
  • Une précision à gauche optionnelle (chiffres avant la virgule)
  • Une précision à droite optionnelle (décimales)
  • Un caractère de conversion obligatoire (i, n ou %)
Drapeaux disponibles

=f — Définit le caractère de remplissage (padding). Le signe = est suivi d'un caractère unique. Par défaut : l'espace. Exemple : =* utilise * pour compléter le champ.

^ — Désactive le groupage des chiffres (séparateurs de milliers) défini par la locale. Utile pour des sorties brutes sans ponctuation.

+ ou ( — Style d'affichage des signes. Avec + : les équivalents locale de + et - sont utilisés. Avec ( : les valeurs négatives apparaissent entre parenthèses, convention comptable anglo-saxonne.

! — Supprime le symbole monétaire dans la sortie finale.

- — Justification à gauche du champ (le padding est ajouté à droite). Par défaut : justification à droite.

Taille du champ (w)

Un entier décimal w définit la largeur minimale du champ formaté en caractères. Complété à gauche par défaut, à droite si le drapeau - est actif. Utile pour aligner des colonnes de montants dans des tableaux texte.

Précision à gauche (#n)

#n — Spécifie le nombre maximal de chiffres avant le séparateur décimal. Permet l'alignement vertical de colonnes monétaires. Si le nombre réel dépasse n, ce paramètre est ignoré. Les séparateurs de groupage sont insérés avant les caractères de remplissage.

Précision à droite (.p)

.p — Un point suivi du nombre de décimales souhaitées. Si p = 0 : le séparateur décimal et les décimales sont supprimés. Sans précision explicite, la valeur par défaut de la locale est utilisée. Le nombre est arrondi en conséquence.

Caractères de conversion (obligatoires)

i — Format monétaire international de la locale (ex. pour fr_FR : 1 234,56 EUR). Utilise le code ISO 4217.

n — Format monétaire national de la locale (ex. pour de_DE : EU1.234,56). Utilise le symbole local.

% — Retourne simplement le caractère littéral % (échappement).

nombre

Requis. Le nombre flottant à formater selon les règles monétaires de la locale active.


Note importante : money_format() nécessitait que le système d'exploitation dispose de la capacité strfmon(). Windows ne la supporte pas, rendant la fonction indisponible sur les serveurs Windows. De plus, les locales disponibles dépendent de l'installation du serveur Linux/macOS.


Exemple 1 — Formatage international et national multi-locales

Cet exemple illustre les différents formats selon la locale active : US, Italie, Allemagne et Grande-Bretagne, avec gestion des négatifs et du padding.

  📋 Copier le code

<?php
// Valeur positive de test
$number = 1234.56;

// Format international en_US : utilise le code ISO (USD) et la virgule comme séparateur de milliers
setlocale(LC_MONETARY, 'en_US');
echo money_format('%i', $number) . "\n";
// Résultat : USD 1,234.56

// Format national it_IT avec 2 décimales forcées (.2n)
setlocale(LC_MONETARY, 'it_IT');
echo money_format('%.2n', $number) . "\n";
// Résultat : L. 1.234,56

// Passage à un nombre négatif pour tester la gestion des signes
$number = -1234.5672;

// en_US national : parenthèses pour négatif (flag "("), 10 chiffres de précision à gauche (#10)
setlocale(LC_MONETARY, 'en_US');
echo money_format('%(#10n', $number) . "\n";
// Résultat : ($        1,234.57)  — le nombre est arrondi et encadré de parenthèses

// Même format + 2 décimales (.2) + caractère de remplissage '*' (=*)
echo money_format('%=*(#10.2n', $number) . "\n";
// Résultat : ($********1,234.57) — les espaces sont remplacés par des astérisques

// de_DE international : justification gauche (-), champ de 14 chars, pas de groupage (^), remplissage '*'
setlocale(LC_MONETARY, 'de_DE');
echo money_format('%=*^-14#8.2i', 1234.56) . "\n";
// Résultat : DEM 1234,56**** — aligné à gauche, sans séparateur de milliers

// en_GB avec texte autour : le %% dans la chaîne produit un % littéral dans la sortie
setlocale(LC_MONETARY, 'en_GB');
$fmt = 'Montant final : %i (après 10 %% de remise)';
echo money_format($fmt, 1234.56) . "\n";
// Résultat : Montant final : GBP 1,234.56 (après 10 % de remise)
?>

Alternatives modernes à money_format() en PHP 8+

Depuis la suppression de money_format() en PHP 8.0, la solution officielle et recommandée est la classe NumberFormatter de l'extension intl (ICU). Elle offre un formatage monétaire multilingue robuste, compatible Windows, Linux et macOS, sans dépendance à strfmon().

Exemple 2 — NumberFormatter : remplacement direct de money_format()

La classe NumberFormatter avec le type CURRENCY est la solution moderne pour tout formatage de devise en PHP 8. Elle gère automatiquement les symboles, séparateurs et décimales selon la locale ICU.

  📋 Copier le code

<?php
// Vérifier que l'extension intl est bien chargée (requise pour NumberFormatter)
if (!extension_loaded('intl')) {
    die('Extension intl requise. Activez-la dans php.ini : extension=intl');
}

// Formatage en dollars US — locale 'en_US', devise 'USD'
$fmt_us = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
echo $fmt_us->formatCurrency(1234.56, 'USD') . "\n";
// Résultat : $1,234.56

// Formatage en euros selon la locale française — locale 'fr_FR', devise 'EUR'
$fmt_fr = new NumberFormatter('fr_FR', NumberFormatter::CURRENCY);
echo $fmt_fr->formatCurrency(1234.56, 'EUR') . "\n";
// Résultat : 1 234,56 € (espace insécable comme séparateur de milliers)

// Formatage en yens japonais — pas de décimales par convention
$fmt_jp = new NumberFormatter('ja_JP', NumberFormatter::CURRENCY);
echo $fmt_jp->formatCurrency(1234.56, 'JPY') . "\n";
// Résultat : ¥1,235 (arrondi car le yen n'a pas de sous-unité)

// Valeur négative : la gestion du signe est automatique selon la locale
$fmt_de = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
echo $fmt_de->formatCurrency(-1234.56, 'EUR') . "\n";
// Résultat : -1.234,56 € (convention allemande : point milliers, virgule décimale)

// Personnalisation : forcer 0 décimales pour affichage arrondi
$fmt_fr->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, 0);
echo $fmt_fr->formatCurrency(1234.56, 'EUR') . "\n";
// Résultat : 1 235 €
?>

Tableau comparatif : money_format() vs NumberFormatter

Critèremoney_format()NumberFormatter (intl)
PHP 8+❌ Supprimée✅ Recommandée
Windows❌ Non disponible✅ Compatible
Locales ICU❌ Système OS✅ Base ICU embarquée
PersonnalisationLimitée (chaîne format)✅ Très étendue (attributs)
Parsing inverse❌ Non✅ parseCurrency()

Par carabde | Mis à jour le 23 février 2026