Библиотека Globalize строится на стандартах Unicode CLDR (Common Locale Data Repository), поэтому все паттерны форматирования чисел, валют, дат и сообщений опираются на локализованные правила, а не на фиксированные шаблоны JavaScript. Это обеспечивает единообразное поведение во всех поддерживаемых локалях.
Форматирование чисел в Globalize реализуется через набор предопределённых паттернов, которые интерпретируются в зависимости от текущей локали. Основная идея заключается в разделении структуры числа и его визуального представления.
Ключевые символы паттернов чисел:
0 — обязательная цифра# — необязательная цифра. — десятичный разделитель, — групповой разделительE — экспоненциальная запись% — процентное преобразование¤ — символ валютыGlobalize использует стандартные паттерны CLDR, которые задают поведение форматирования.
Паттерн:
#,##
Пример логики:
1234567en: 1,234,567ru: 1 234 567Группировка определяется локалью, а не самим паттерном.
Паттерн:
00000
Поведение:
42 → 0004212345 → 12345Символ 0 гарантирует наличие цифры, даже если значение
отсутствует.
Паттерн:
#,##0.00
Логика:
Примеры:
12.3 → 12.3012 → 12.0012.345 → 12.35Округление выполняется по стандартным математическим правилам локали.
Формат валюты строится на паттерне:
¤#,##0.00
Символ ¤ заменяется на локализованное обозначение
валюты.
$1,234.561.234,56 €1 234,56 ₸Особенности:
Процентные паттерны используют символ %, который
выполняет преобразование значения:
#
с модификатором процента:
#
но в CLDR применяется специализированная логика:
#
Фактический паттерн:
#
и правило умножения на 100 с добавлением % в зависимости
от локали.
Примеры:
0.75 → 75%0.1234 → 12% (с округлением)В некоторых локалях символ % может располагаться с
пробелом:
75 %Для очень больших или очень малых чисел используется формат:
0.###E0
Разбор:
E — разделитель экспонентыПримеры:
12345 → 1.2345E40.00012 → 1.2E-4Паттерн может варьироваться в зависимости от локали, особенно в части количества знаков после точки.
Globalize не фиксирует символы разделителей в паттернах — они берутся из CLDR:
. или ,,, пробел или неразрывный
пробелПримеры:
en-US: 1,000.5fr-FR: 1 000,5ru-RU: 1 000,5Эта абстракция позволяет одному и тому же паттерну работать во всех регионах без изменений.
Форматирование чисел выполняется через единый интерфейс:
Globalize.locale("ru");
Globalize.formatNumber(12345.678, {
minimumFractionDigits: 2,
maximumFractionDigits: 2
});
Результат:
12 345,68
При указании кастомного паттерна:
Globalize.formatNumber(12345.678, {
pattern: "#,##0.00"
});
Паттерны проходят несколько этапов обработки:
Особенность Globalize заключается в том, что один и тот же паттерн не содержит информации о конкретной локали, что позволяет использовать его универсально.
Символ # позволяет скрывать незначащие нули:
Паттерн:
#,##0.##
Примеры:
12.3 → 12.312.30 → 12.312.345 → 12.35Это важно для финансовых и статистических данных, где лишние нули не несут смысла.
CLDR поддерживает разные схемы группировки:
Паттерн:
#,###
не фиксирует размер группы, он лишь указывает наличие группировки.
Пример различий:
12345678
12,345,6781,23,45,678Любые символы, не относящиеся к числовым спецификаторам, воспринимаются как литералы:
Паттерн:
#,##0 "units"
Результат:
1200 → 1,200 unitsДля валют и процентов используются специальные символы ¤
и %, которые не требуют экранирования.
Globalize применяет округление по стандарту HALF_EVEN или HALF_UP в зависимости от конфигурации CLDR.
Примеры:
1.235 при #.## → 1.241.234 → 1.23Контроль точности осуществляется через параметры:
minimumFractionDigitsmaximumFractionDigitsПаттерн не зависит от локали, но результат полностью определяется локальными данными CLDR:
| Локаль | Паттерн | Результат |
|---|---|---|
| en-US | #,##0.00 |
1,234.56 |
| de-DE | #,##0.00 |
1.234,56 |
| ru-RU | #,##0.00 |
1 234,56 |
Это разделение обеспечивает переносимость кода между регионами без модификации логики форматирования.
CLDR задаёт не только символы, но и их поведение:
Паттерн лишь определяет структуру числа, а визуальная часть полностью делегируется локализации.