В международных приложениях одно и то же значение может иметь различные представления в зависимости от локали. Библиотека Globalize опирается на данные CLDR и обеспечивает единообразную работу с форматированием и разбором чисел, валют и единиц измерения без привязки к конкретной культуре.
Основной слой работы с числовыми значениями строится вокруг двух операций:
Форматирование учитывает локальные правила:
Globalize.load(cldrData);
const globalize = new Globalize("en");
globalize.numberFormatter()(1234567.89);
// "1,234,567.89"
При смене локали изменяется только представление, а не само значение:
const ru = new Globalize("ru");
ru.numberFormatter()(1234567.89);
// "1 234 567,89"
Ключевая особенность заключается в том, что форматирование не изменяет числовую природу данных — оно формирует строковое представление, пригодное для интерфейса.
Разбор выполняется с учётом локальных правил, что позволяет корректно интерпретировать пользовательский ввод:
const parseNumber = ru.numberParser();
parseNumber("1 234 567,89");
// 1234567.89
Важный аспект — различие форматов между локалями. Строка, корректная для одной культуры, может быть некорректной для другой, поэтому разбор всегда привязан к конкретному экземпляру Globalize.
Работа с валютами в Globalize ограничивается отображением и разбором значений. Сам процесс пересчёта между валютами не входит в функциональность библиотеки и реализуется отдельно.
const en = new Globalize("en");
en.currencyFormatter("USD")(1000.5);
// "$1,000.50"
Для других локалей изменяется способ отображения символа и порядок:
const de = new Globalize("de");
de.currencyFormatter("EUR")(1000.5);
// "1.000,50 €"
Globalize не выполняет:
Единственная ответственность — корректное представление уже заданного значения в выбранной валюте.
Система единиц в Globalize основана на CLDR unit patterns. Она отвечает за форматирование величин в человекочитаемом виде.
const en = new Globalize("en");
en.unitFormatter("kilometer")(5);
// "5 kilometers"
Для другой локали меняется структура строки:
const fr = new Globalize("fr");
fr.unitFormatter("kilometer")(5);
// "5 kilomètres"
Поддерживаются различные типы единиц:
Форматирование единиц не подразумевает автоматического пересчёта:
en.unitFormatter("mile")(5);
// "5 miles"
Если требуется перевод значений между системами (например, километры → мили), расчёт выполняется отдельно:
const km = 10;
const miles = km * 0.621371;
en.unitFormatter("mile")(miles);
// "6.21371 miles"
Таким образом, Globalize разделяет:
Globalize работает с датами исключительно на уровне форматирования и разбора, без управления часовыми поясами или преобразования временных зон.
const en = new Globalize("en");
en.dateFormatter({ datetime: "medium" })(new Date(2026, 0, 15));
// "Jan 15, 2026, 12:00:00 AM"
const ja = new Globalize("ja");
ja.dateFormatter({ datetime: "medium" })(new Date(2026, 0, 15));
// "2026/01/15 0:00:00"
Изменения касаются только представления:
const parser = en.dateParser({ skeleton: "yMd" });
parser("01/15/2026");
// Date object
Некоторые локали используют альтернативные системы записи чисел. Globalize учитывает это при форматировании.
const ar = new Globalize("ar");
ar.numberFormatter()(123);
// "١٢٣"
При этом внутреннее значение остаётся стандартным числом JavaScript.
В реальных сценариях конвертация представления включает одновременное использование чисел, единиц и валют.
const en = new Globalize("en");
const priceFormatter = en.currencyFormatter("USD");
const distanceFormatter = en.unitFormatter("mile");
priceFormatter(1200);
// "$1,200.00"
distanceFormatter(15.5);
// "15.5 miles"
Типичный поток данных:
Globalize участвует только на этапе локализации представления.
Архитектура работы с международными данными опирается на строгий принцип разделения задач:
Такой подход исключает неоднозначность и позволяет поддерживать единый слой локализации для множества доменов данных: чисел, валют, единиц и дат.