money_format()
Notre article présente la fonction PHP money_format(), utilisée pour formater un nombre en chaîne monétaire selon la locale active.
La fonction money_format() formate un nombre en chaîne monétaire, en appliquant un séparateur de milliers, un séparateur décimal et un symbole monétaire conformément à la locale active.
Important : money_format() est dépréciée depuis PHP 7.4 et supprimée dans PHP 8.0. Elle n'a également jamais existé sous Windows. Si vous écrivez du nouveau code, passez directement à la section Remplacement moderne ci-dessous — le reste de cette page documente la fonction historique afin que vous puissiez lire et maintenir du code PHP plus ancien.
Syntaxe
string money_format ( string $format , float $number )La fonction accepte deux paramètres :
$format– une chaîne décrivant comment formater le nombre. Elle contient une ou plusieurs spécifications de conversion (chacune commençant par%), à l'instar desprintf(). Tout texte hors d'une spécification est affiché tel quel.$number– la valeur numérique à formater.
Elle retourne la chaîne formatée.
Spécificateurs de format courants
| Spécificateur | Signification | Exemple de sortie (en_US, 1234.56) |
|---|---|---|
%n | Format monétaire national (local) | $1,234.56 |
%i | Format monétaire international | USD 1,234.56 |
%.2n | Format national, 2 décimales | $1,234.56 |
%(n | Montants négatifs entre parenthèses | ($1,234.56) |
%!n | Supprime le symbole monétaire | 1,234.56 |
La locale (définie avec setlocale()) détermine le symbole monétaire, le caractère de groupement et le séparateur décimal utilisés.
Exemple
<?php
$number = 1234.56;
setlocale(LC_MONETARY, 'en_US');
echo money_format('%n', $number);
?>Ici $number contient une valeur en virgule flottante, et l'appel à setlocale() configure la locale monétaire sur en_US. La sortie est :
$1,234.56Attention : setlocale() retourne false si la locale demandée n'est pas installée sur le serveur, et money_format() revient alors silencieusement à une valeur par défaut. Vérifiez toujours que le nom de la locale (par exemple en_US ou en_US.UTF-8) existe bien sur votre système.
Remplacement moderne : NumberFormatter
Étant donné que money_format() a disparu dans PHP 8, l'approche recommandée est la classe NumberFormatter de l'extension intl. Elle est sensible à la locale, fonctionne sur toutes les plateformes (y compris Windows) et utilise les données ICU plutôt que la locale système :
<?php
$number = 1234.56;
$formatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
echo $formatter->formatCurrency($number, 'USD');
?>Sortie :
$1,234.56Pour formater le même montant pour une locale et une devise différentes, il suffit de modifier la locale passée au constructeur et le code devise :
<?php
$number = 1234.56;
$de = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
echo $de->formatCurrency($number, 'EUR');
?>Sortie (le groupement allemand utilise un point pour les milliers et une virgule pour les décimales) :
1.234,56 €Quand utiliser quoi
- Nouveau code : utilisez
NumberFormatter::formatCurrency()— c'est le seul formateur monétaire disponible en PHP 8+. - Code existant sous PHP 7.4 ou antérieur :
money_format()fonctionne encore mais émettra un avertissement de dépréciation ; prévoyez une migration. - Nombres simples sans devise : si vous n'avez besoin que d'un séparateur de milliers et de décimales fixes (sans symbole monétaire ni règles de locale),
number_format()est plus léger.
Fonctions associées
number_format()– formate un nombre avec regroupement des milliers.setlocale()– définit la locale utilisée parmoney_format()et d'autres fonctions sensibles à la locale.sprintf()/printf()– formatage de chaînes généraliste.round()– arrondit une valeur avant de la formater en montant.