Базовые паттерны форматирования

Библиотека Globalize строится на стандартах Unicode CLDR (Common Locale Data Repository), поэтому все паттерны форматирования чисел, валют, дат и сообщений опираются на локализованные правила, а не на фиксированные шаблоны JavaScript. Это обеспечивает единообразное поведение во всех поддерживаемых локалях.

Форматирование чисел в Globalize реализуется через набор предопределённых паттернов, которые интерпретируются в зависимости от текущей локали. Основная идея заключается в разделении структуры числа и его визуального представления.

Ключевые символы паттернов чисел:

  • 0 — обязательная цифра
  • # — необязательная цифра
  • . — десятичный разделитель
  • , — групповой разделитель
  • E — экспоненциальная запись
  • % — процентное преобразование
  • ¤ — символ валюты

Основные паттерны чисел

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

Целые числа и группы разрядов

Паттерн:

#,##

Пример логики:

  • входное значение: 1234567
  • локаль en: 1,234,567
  • локаль ru: 1 234 567

Группировка определяется локалью, а не самим паттерном.

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

Паттерн:

00000

Поведение:

  • число 4200042
  • число 1234512345

Символ 0 гарантирует наличие цифры, даже если значение отсутствует.

Дробные числа

Паттерн:

#,##0.00

Логика:

  • минимум одна целая цифра
  • ровно две дробные позиции

Примеры:

  • 12.312.30
  • 1212.00
  • 12.34512.35

Округление выполняется по стандартным математическим правилам локали.


Форматирование валют

Формат валюты строится на паттерне:

¤#,##0.00

Символ ¤ заменяется на локализованное обозначение валюты.

Примеры поведения

  • USD (en): $1,234.56
  • EUR (de): 1.234,56 €
  • KZT (ru-KZ): 1 234,56 ₸

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

  • положение символа валюты определяется локалью
  • разделители тысяч и дробей локализуются автоматически
  • количество дробных знаков зависит от валютного кода (например, JPY не имеет дробной части)

Процентное форматирование

Процентные паттерны используют символ %, который выполняет преобразование значения:

#

с модификатором процента:

#

но в CLDR применяется специализированная логика:

#

Фактический паттерн:

#

и правило умножения на 100 с добавлением % в зависимости от локали.

Примеры:

  • 0.7575%
  • 0.123412% (с округлением)

В некоторых локалях символ % может располагаться с пробелом:

  • 75 %

Экспоненциальная запись

Для очень больших или очень малых чисел используется формат:

0.###E0

Разбор:

  • левая часть — мантисса
  • E — разделитель экспоненты
  • правая часть — порядок

Примеры:

  • 123451.2345E4
  • 0.000121.2E-4

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


Локализация разделителей

Globalize не фиксирует символы разделителей в паттернах — они берутся из CLDR:

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

Примеры:

  • en-US: 1,000.5
  • fr-FR: 1 000,5
  • ru-RU: 1 000,5

Эта абстракция позволяет одному и тому же паттерну работать во всех регионах без изменений.


Базовые операции с Globalize.formatNumber

Форматирование чисел выполняется через единый интерфейс:

Globalize.locale("ru");

Globalize.formatNumber(12345.678, {
  minimumFractionDigits: 2,
  maximumFractionDigits: 2
});

Результат:

12 345,68

При указании кастомного паттерна:

Globalize.formatNumber(12345.678, {
  pattern: "#,##0.00"
});

Нормализация паттернов

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

  1. Разбор строки паттерна
  2. Выделение целой и дробной части
  3. Применение локальных правил округления
  4. Подстановка разделителей из CLDR
  5. Формирование итоговой строки

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


Форматирование с необязательными цифрами

Символ # позволяет скрывать незначащие нули:

Паттерн:

#,##0.##

Примеры:

  • 12.312.3
  • 12.3012.3
  • 12.34512.35

Это важно для финансовых и статистических данных, где лишние нули не несут смысла.


Группировка разрядов

CLDR поддерживает разные схемы группировки:

  • 3-3-3 (стандарт)
  • 3-2-2 (в некоторых азиатских локалях)
  • пользовательские схемы

Паттерн:

#,###

не фиксирует размер группы, он лишь указывает наличие группировки.

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

  • 12345678

    • en-US → 12,345,678
    • hi-IN → 1,23,45,678

Экранирование и буквенные символы

Любые символы, не относящиеся к числовым спецификаторам, воспринимаются как литералы:

Паттерн:

#,##0 "units"

Результат:

  • 12001,200 units

Для валют и процентов используются специальные символы ¤ и %, которые не требуют экранирования.


Ограничения точности и округление

Globalize применяет округление по стандарту HALF_EVEN или HALF_UP в зависимости от конфигурации CLDR.

Примеры:

  • 1.235 при #.##1.24
  • 1.2341.23

Контроль точности осуществляется через параметры:

  • minimumFractionDigits
  • maximumFractionDigits

Сочетание паттернов и локалей

Паттерн не зависит от локали, но результат полностью определяется локальными данными CLDR:

Локаль Паттерн Результат
en-US #,##0.00 1,234.56
de-DE #,##0.00 1.234,56
ru-RU #,##0.00 1 234,56

Это разделение обеспечивает переносимость кода между регионами без модификации логики форматирования.


Позиционирование символов и визуальные правила

CLDR задаёт не только символы, но и их поведение:

  • пробел между числом и валютой
  • направление размещения символа валюты
  • наличие неразрывных пробелов
  • правила округления при отображении

Паттерн лишь определяет структуру числа, а визуальная часть полностью делегируется локализации.