Конвертация между системами

В международных приложениях одно и то же значение может иметь различные представления в зависимости от локали. Библиотека Globalize опирается на данные CLDR и обеспечивает единообразную работу с форматированием и разбором чисел, валют и единиц измерения без привязки к конкретной культуре.

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

  • форматирование (internal value → локализованная строка)
  • разбор (локализованная строка → internal value)

Форматирование чисел

Форматирование учитывает локальные правила:

  • разделитель дробной части
  • разделитель тысяч
  • группировка цифр
  • отображение знаков
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 учитывает это при форматировании.

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

  • латинские цифры: 0–9
  • арабские-индийские цифры: ٠–٩
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"

Последовательность обработки данных

Типичный поток данных:

  1. внутреннее числовое значение
  2. (при необходимости) внешняя конвертация
  3. выбор локали
  4. форматирование через Globalize
  5. вывод строки

Globalize участвует только на этапе локализации представления.


Разделение ответственности при конвертации

Архитектура работы с международными данными опирается на строгий принцип разделения задач:

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

Такой подход исключает неоднозначность и позволяет поддерживать единый слой локализации для множества доменов данных: чисел, валют, единиц и дат.