money_format()
Статья о функции PHP money_format(), которая используется для форматирования числа в виде строки валюты. Функция полезна при работе с числами.
Функция money_format() форматирует число в виде строки валюты, применяя разделитель тысяч, десятичную точку и символ валюты в соответствии с активной локалью.
Важно: money_format() объявлена устаревшей в PHP 7.4 и удалена в PHP 8.0. Кроме того, она никогда не существовала в Windows. Если вы пишете новый код, сразу переходите к разделу Современная замена ниже — остальная часть страницы документирует устаревшую функцию, чтобы вы могли читать и поддерживать старый PHP-код.
Синтаксис
string money_format ( string $format , float $number )Функция принимает два параметра:
$format– строка, описывающая способ форматирования числа. Она содержит одну или несколько спецификаций преобразования (каждая начинается с%), аналогичноsprintf(). Любой текст вне спецификации выводится дословно.$number– числовое значение для форматирования.
Функция возвращает отформатированную строку.
Основные спецификаторы формата
| Спецификатор | Значение | Пример вывода (en_US, 1234.56) |
|---|---|---|
%n | Национальный (местный) формат валюты | $1,234.56 |
%i | Международный формат валюты | USD 1,234.56 |
%.2n | Национальный формат, 2 знака после запятой | $1,234.56 |
%(n | Отрицательные суммы в скобках | ($1,234.56) |
%!n | Скрыть символ валюты | 1,234.56 |
Локаль (задаётся с помощью setlocale()) определяет, какой символ валюты, символ группировки и десятичный разделитель используются.
Пример
<?php
$number = 1234.56;
setlocale(LC_MONETARY, 'en_US');
echo money_format('%n', $number);
?>Здесь $number содержит значение с плавающей точкой, а вызов setlocale() настраивает денежную локаль на en_US. Вывод:
$1,234.56Внимание: setlocale() возвращает false, если запрошенная локаль не установлена на сервере, и тогда money_format() молча использует локаль по умолчанию. Всегда проверяйте, что имя локали (например en_US или en_US.UTF-8) действительно существует в вашей системе.
Современная замена: NumberFormatter
Поскольку money_format() удалена в PHP 8, рекомендуемым подходом является класс NumberFormatter из расширения intl. Он учитывает локаль, работает на всех платформах (включая Windows) и использует данные ICU, а не системную локаль:
<?php
$number = 1234.56;
$formatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
echo $formatter->formatCurrency($number, 'USD');
?>Вывод:
$1,234.56Чтобы отформатировать ту же сумму для другой локали и валюты, просто измените локаль в конструкторе и код валюты:
<?php
$number = 1234.56;
$de = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
echo $de->formatCurrency($number, 'EUR');
?>Вывод (в немецкой группировке точка используется как разделитель тысяч, а запятая — как десятичный разделитель):
1.234,56 €Что и когда использовать
- Новый код: используйте
NumberFormatter::formatCurrency()— это единственный форматировщик валюты, доступный в PHP 8+. - Устаревший код на PHP 7.4 или более ранней версии:
money_format()всё ещё работает, но будет выдавать предупреждение об устаревании; планируйте миграцию. - Простые нефинансовые числа: если вам нужен только разделитель тысяч и фиксированное количество знаков после запятой (без символа валюты или правил локали),
number_format()является более лёгким вариантом.
Связанные функции
number_format()– форматирование числа с группировкой тысяч.setlocale()– установка локали, используемойmoney_format()и другими чувствительными к локали функциями.sprintf()/printf()– форматирование строк общего назначения.round()– округление значения перед его форматированием как денежной суммы.