Форматирование денежных значений в JavaScript строится вокруг
стандарта ECMA-402, реализованного через Intl.NumberFormat.
Именно этот API отвечает за корректное отображение валютных символов,
кодов и локализованных названий, учитывая правила конкретной языковой
среды.
Ключевая возможность появляется при установке параметра
style: "currency". В этом режиме числовое значение
интерпретируется как денежная величина, а форматирование дополняется
валютными обозначениями.
new Intl.NumberFormat("ru-RU", {
style: "currency",
currency: "RUB"
}).format(1234.56);
Результат:
1 234,56 ₽
Форматирование включает сразу несколько уровней локализации:
Обязательным при использовании style: "currency"
является параметр currency. Он задаёт валюту в формате ISO
4217:
currency: "USD"
currency: "EUR"
currency: "JPY"
currency: "KZT"
Без указания валюты форматирование невозможно, поскольку символ, код и правила округления зависят именно от этого значения.
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD"
}).format(99.99);
Результат:
$99.99
Параметр currencyDisplay определяет способ визуализации
валютного обозначения. Поддерживаются несколько режимов, влияющих на
финальный вид строки.
Значение по умолчанию во многих локалях. Используется графический символ валюты.
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
currencyDisplay: "symbol"
}).format(100);
Результат:
$100.00
Отображается буквенный ISO-код валюты.
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
currencyDisplay: "code"
}).format(100);
Результат:
USD 100.00
Этот режим полезен при неоднозначности символов валют или в интерфейсах с высокой формальностью.
Вместо символа используется локализованное название валюты.
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
currencyDisplay: "name"
}).format(100);
Результат:
100.00 US dollars
Локализация названий зависит от выбранной языковой среды.
Компактное отображение символа, применяемое в условиях ограниченного пространства или неформального интерфейса.
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
currencyDisplay: "narrowSymbol"
}).format(100);
Результат обычно совпадает с symbol, но в некоторых
локалях может отличаться.
Отображение валюты зависит от локали, а не только от параметров форматирования. Один и тот же код валюты может визуально различаться.
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "EUR"
}).format(100);
€100.00
new Intl.NumberFormat("de-DE", {
style: "currency",
currency: "EUR"
}).format(100);
100,00 €
Различия включают:
Параметр currencySign управляет способом отображения
отрицательных значений. Основное значение — standard,
альтернативное — accounting.
Обычное математическое представление отрицательных чисел:
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
currencySign: "standard"
}).format(-100);
Результат:
-$100.00
Бухгалтерский стиль, при котором отрицательные значения заключаются в скобки:
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
currencySign: "accounting"
}).format(-100);
Результат:
($100.00)
Этот формат широко используется в финансовой отчётности, так как визуально отделяет отрицательные суммы от положительных без использования минуса.
Расположение символа валюты определяется локалью и не зависит от кода валюты.
new Intl.NumberFormat("fr-FR", {
style: "currency",
currency: "EUR"
}).format(2500);
2 500,00 €
new Intl.NumberFormat("en-GB", {
style: "currency",
currency: "GBP"
}).format(2500);
£2,500.00
Эти различия обусловлены традициями типографики и финансового оформления в разных языковых регионах.
Валюта автоматически влияет на правила округления. Для большинства валют применяется стандартная точность в два знака после запятой, но существуют исключения.
new Intl.NumberFormat("ja-JP", {
style: "currency",
currency: "JPY"
}).format(1234.56);
¥1,235
Для иены дробная часть не используется, поэтому значение округляется до целого числа.
Дополнительные параметры:
minimumFractionDigitsmaximumFractionDigitsмогут изменять поведение, но валютные правила имеют приоритет в стандартной конфигурации.
При больших числах используется сокращённый формат через параметр
notation.
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
notation: "compact"
}).format(1200000);
Результат:
$1.2M
Сокращение зависит от локали и может отличаться по правилам обозначений миллионов, миллиардов и триллионов.
ISO-коды валют строго регламентированы. При передаче некорректного
значения форматирование может привести к ошибке
RangeError.
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "INVALID"
}).format(100);
Такие случаи требуют предварительной валидации кодов валют.
Между числом и символом валюты часто используется не обычный пробел,
а неразрывный пробел (\u00A0 или \u202F),
предотвращающий разрыв строки:
1 234,56 ₽
Это поведение встроено в реализацию локали и не требует ручного управления.
Форматирование валюты может включать дополнительные параметры
Intl.NumberFormat, влияющие на внешний вид:
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
currencyDisplay: "code",
currencySign: "accounting",
useGrouping: true
}).format(-1234567.89);
Результат:
(USD 1,234,567.89)
Комбинация параметров позволяет управлять: