В основе работы с валютами в Globalize лежит стандарт CLDR (Common Locale Data Repository), который определяет:
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 управляет тем, как именно будет
показана валюта:
| Значение | Описание |
|---|---|
"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 определяет:
Globalize выступает как слой доступа, не вмешиваясь в лингвистическую модель.
Типовые сценарии:
"code","symbol","name","narrowSymbol".Выбор режима влияет не только на визуал, но и на однозначность восприятия значения.