Символы и названия валют

Модель валют в CLDR и её влияние на Globalize

В основе работы с валютами в Globalize лежит стандарт CLDR (Common Locale Data Repository), который определяет:

  • символ валюты (например, $ или €),
  • трёхбуквенный код (USD, EUR, KZT),
  • локализованное название валюты (доллар США, евро, казахстанский тенге),
  • альтернативные формы отображения (узкие символы, бухгалтерский формат и др.).

Globalize не хранит валютные данные самостоятельно — он обращается к CLDR-данным, что обеспечивает единообразие отображения валют в разных локалях.

Ключевая особенность модели — разделение между идентификатором валюты и способом представления. Один и тот же код может отображаться по-разному в зависимости от локали и настроек форматирования.


Базовое форматирование валют

Основной механизм работы с валютами — форматтер валют:

const Globalize = require("globalize");

Globalize.locale("en");

const formatCurrency = Globalize.currencyFormatter("USD");

formatCurrency(1234.56);
// "$1,234.56"

В этом примере:

  • "USD" — код валюты ISO 4217,
  • результат зависит от локали (en),
  • используется стандартный символ $.

Форматтер возвращает функцию, которая применяется многократно без повторной инициализации.


Символ валюты и его локализация

Символ валюты зависит от региона. Один и тот же код может иметь разные визуальные представления:

Globalize.locale("en-US");
Globalize.currencyFormatter("USD")(100);
// "$100.00"

Globalize.locale("en-GB");
Globalize.currencyFormatter("USD")(100);
// "US$100.00"

В британской локали добавляется префикс US, поскольку символ $ неоднозначен.

CLDR решает эту проблему через механизм disambiguation, добавляя уточняющие префиксы или альтернативные символы.


Наравне с символами: код валюты

Отображение валюты может быть задано через ISO-код:

const formatter = Globalize.currencyFormatter("EUR", {
  currencyDisplay: "code"
});

formatter(2500);
// "EUR 2,500.00"

Режим "code" используется в технических интерфейсах, где требуется однозначность, а не визуальная локализация.


Полное название валюты

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

const formatter = Globalize.currencyFormatter("KZT", {
  currencyDisplay: "name"
});

formatter(5000);
// "5,000.00 казахстанский тенге"

Режим "name" активирует текстовое представление валюты, зависящее от текущей локали.

В русской локали это будет:

  • «казахстанский тенге»
  • «доллар США»
  • «евро»

Узкие символы валют

Некоторые валюты имеют альтернативные «узкие» символы (narrow symbols), используемые в компактных интерфейсах:

Globalize.locale("en-US");

const formatter = Globalize.currencyFormatter("USD", {
  currencyDisplay: "narrowSymbol"
});

formatter(99);
// "$99.00"

Для ряда валют разница между symbol и narrowSymbol проявляется сильнее:

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

Настройка отображения валют через currencyDisplay

Параметр currencyDisplay управляет тем, как именно будет показана валюта:

Значение Описание
"symbol" стандартный символ валюты
"code" ISO-код (USD, EUR)
"name" локализованное название
"narrowSymbol" компактный символ

Пример переключения режимов:

const value = 1234.5;

Globalize.currencyFormatter("EUR", { currencyDisplay: "symbol" })(value);
// "€1,234.50"

Globalize.currencyFormatter("EUR", { currencyDisplay: "code" })(value);
// "EUR 1,234.50"

Globalize.currencyFormatter("EUR", { currencyDisplay: "name" })(value);
// "1,234.50 евро"

Локализация названий валют

Названия валют хранятся в CLDR отдельно от форматирования чисел. Globalize использует эти данные при currencyDisplay: "name".

Особенности:

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

Пример различий:

Globalize.locale("ru");

const fmt = Globalize.currencyFormatter("RUB", {
  currencyDisplay: "name"
});

fmt(1);
// "1 российский рубль"

fmt(2);
// "2 российских рубля"

fmt(5);
// "5 российских рублей"

Грамматическая форма валюты полностью определяется CLDR-данными.


Разделение символа и кода в интерфейсной логике

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

  • символ — для компактных таблиц,
  • код — для финансовых отчётов,
  • название — для пользовательских описаний.

Globalize позволяет использовать единый источник данных, меняя только параметры форматирования:

function renderPrice(value, currency, mode) {
  return Globalize.currencyFormatter(currency, {
    currencyDisplay: mode
  })(value);
}

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


Особенности форматирования в разных локалях

Один и тот же вызов форматтера даёт разные результаты:

const amount = 1500;

Globalize.locale("en-US");
Globalize.currencyFormatter("EUR")(amount);
// "€1,500.00"

Globalize.locale("de-DE");
Globalize.currencyFormatter("EUR")(amount);
// "1.500,00 €"

Globalize.locale("fr-FR");
Globalize.currencyFormatter("EUR")(amount);
// "1 500,00 €"

Отличия затрагивают:

  • положение символа валюты,
  • разделители тысяч,
  • десятичный разделитель,
  • пробелы между числом и символом.

Использование валютных форматтеров в архитектуре приложений

Форматтер валюты в Globalize является функцией с замыканием над локалью. Это означает:

  • локаль фиксируется в момент создания форматтера,
  • повторное использование не требует пересборки,
  • изменение глобальной локали не влияет на уже созданные функции.
const usdFormatter = Globalize.currencyFormatter("USD");

Globalize.locale("en-US");
usdFormatter(100);

Globalize.locale("fr-FR");
usdFormatter(100);

Результат останется в исходной локали форматтера, что важно для предсказуемости UI.


Комбинация валюты с числовыми форматами

Currency formatter наследует правила числового форматирования:

  • округление,
  • группировка разрядов,
  • точность дробной части.

Пример:

Globalize.currencyFormatter("JPY")(1234.56);
// "¥1,235"

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


Роль CLDR в отображении валютных названий

CLDR определяет:

  • plural rules для валют,
  • локализованные строки,
  • fallback-механизмы для неизвестных кодов,
  • региональные особенности отображения.

Globalize выступает как слой доступа, не вмешиваясь в лингвистическую модель.


Практика выбора режима отображения валют

Типовые сценарии:

  • финансовые панели — "code",
  • пользовательские интерфейсы — "symbol",
  • отчёты и документы — "name",
  • компактные списки — "narrowSymbol".

Выбор режима влияет не только на визуал, но и на однозначность восприятия значения.