Отображение символов валют

Форматирование денежных значений в JavaScript строится вокруг стандарта ECMA-402, реализованного через Intl.NumberFormat. Именно этот API отвечает за корректное отображение валютных символов, кодов и локализованных названий, учитывая правила конкретной языковой среды.

Ключевая возможность появляется при установке параметра style: "currency". В этом режиме числовое значение интерпретируется как денежная величина, а форматирование дополняется валютными обозначениями.

new Intl.NumberFormat("ru-RU", {
  style: "currency",
  currency: "RUB"
}).format(1234.56);

Результат:

1 234,56 ₽

Форматирование включает сразу несколько уровней локализации:

  • порядок расположения символа валюты
  • пробелы между числом и обозначением
  • правила округления
  • разделители групп разрядов

Параметр currency и его роль

Обязательным при использовании 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

Параметр currencyDisplay определяет способ визуализации валютного обозначения. Поддерживаются несколько режимов, влияющих на финальный вид строки.

symbol

Значение по умолчанию во многих локалях. Используется графический символ валюты.

new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  currencyDisplay: "symbol"
}).format(100);

Результат:

$100.00

code

Отображается буквенный ISO-код валюты.

new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  currencyDisplay: "code"
}).format(100);

Результат:

USD 100.00

Этот режим полезен при неоднозначности символов валют или в интерфейсах с высокой формальностью.

name

Вместо символа используется локализованное название валюты.

new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  currencyDisplay: "name"
}).format(100);

Результат:

100.00 US dollars

Локализация названий зависит от выбранной языковой среды.

narrowSymbol

Компактное отображение символа, применяемое в условиях ограниченного пространства или неформального интерфейса.

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 и бухгалтерское форматирование

Параметр currencySign управляет способом отображения отрицательных значений. Основное значение — standard, альтернативное — accounting.

standard

Обычное математическое представление отрицательных чисел:

new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  currencySign: "standard"
}).format(-100);

Результат:

-$100.00

accounting

Бухгалтерский стиль, при котором отрицательные значения заключаются в скобки:

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

Для иены дробная часть не используется, поэтому значение округляется до целого числа.

Дополнительные параметры:

  • minimumFractionDigits
  • maximumFractionDigits

могут изменять поведение, но валютные правила имеют приоритет в стандартной конфигурации.

Компактное отображение валютных значений

При больших числах используется сокращённый формат через параметр 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);

Такие случаи требуют предварительной валидации кодов валют.

Влияние spacing и Unicode-символов

Между числом и символом валюты часто используется не обычный пробел, а неразрывный пробел (\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)

Комбинация параметров позволяет управлять:

  • визуальной формой валюты
  • способом отображения отрицательных значений
  • группировкой разрядов
  • локализацией числового формата