Предопределенные стили

В библиотеке Globalize форматирование чисел, дат и единиц измерения строится на данных CLDR (Unicode Common Locale Data Repository). Поверх этих данных реализован слой абстракций, который позволяет использовать готовые шаблоны форматирования, называемые предопределёнными стилями. Эти стили обеспечивают единообразное представление данных в зависимости от локали без необходимости вручную конструировать шаблоны.

Общая модель предопределённых стилей

Предопределённые стили представляют собой именованные конфигурации форматирования, которые соответствуют стандартам интернационализации. Вместо описания формата вручную используются идентификаторы, например:

  • short
  • medium
  • long
  • full
  • decimal
  • currency
  • percent
  • scientific
  • short, long (в контексте единиц измерения)

Каждый стиль связан с конкретной записью в CLDR, которая различается для каждой локали.

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


Предопределённые стили дат и времени

Форматирование даты и времени в Globalize основано на четырёх базовых стилях, соответствующих CLDR datetime skeletons.

Стиль short

Минимально подробное представление даты и времени.

const Globalize = require("globalize");

const dateFormatter = Globalize("ru").dateFormatter({ datetime: "short" });

dateFormatter(new Date());

Характерные особенности:

  • сокращённые числовые формы
  • отсутствие названий месяцев
  • компактное отображение времени

Примеры:

  • 27.05.26, 14:30

Стиль medium

Баланс между краткостью и читаемостью.

Globalize("ru").dateFormatter({ datetime: "medium" });

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

  • частичное использование текстовых элементов (например, сокращённые месяцы)
  • более читаемый формат по сравнению с short

Пример:

  • 27 мая 2026 г., 14:30:00

Стиль long

Полностью текстовое представление даты с расширенной информацией.

Globalize("ru").dateFormatter({ datetime: "long" });

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

  • полное название месяца
  • указание временной зоны (в зависимости от данных CLDR)

Пример:

  • 27 мая 2026 года в 14:30:00 UTC+6

Стиль full

Максимально подробный формат.

Globalize("ru").dateFormatter({ datetime: "full" });

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

  • полное название дня недели
  • полное представление даты и времени
  • расширенная локализация

Пример:

  • среда, 27 мая 2026 года в 14:30:00 по времени UTC+6

Предопределённые стили чисел

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

Decimal (десятичный формат)

Базовое форматирование чисел без дополнительных символов.

const numberFormatter = Globalize("ru").numberFormatter({ style: "decimal" });

numberFormatter(1234567.89);

Характеристики:

  • разделители групп разрядов зависят от локали
  • используется стандартная точность

Пример:

  • 1 234 567,89

Percent (проценты)

Форматирование числа как процента с автоматическим масштабированием.

Globalize("ru").numberFormatter({ style: "percent" })(0.25);

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

  • значение умножается на 100
  • добавляется символ %

Пример:

  • 25 %

Currency (валюта)

Форматирование с учётом локальных правил отображения валют.

Globalize("ru").numberFormatter({
  style: "currency",
  currency: "KZT"
})(1234.56);

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

  • символ валюты или код зависит от локали
  • позиция символа (до или после числа) определяется CLDR
  • поддержка округления по правилам валют

Пример:

  • 1 234,56 ₸

Scientific (научная нотация)

Представление чисел в экспоненциальной форме.

Globalize("ru").numberFormatter({ style: "scientific" })(12345);

Пример:

  • 1,2345E4

Используется в научных и технических вычислениях, где важен порядок величины.


Компактные стили чисел

Компактные стили используются для сокращённого отображения больших чисел.

Globalize("ru").numberFormatter({
  style: "decimal",
  notation: "compact"
})(1200000);

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

  • автоматическое сокращение до тысяч, миллионов, миллиардов
  • локализованные суффиксы

Примеры:

  • 1,2 млн
  • 1,2 млрд

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


Предопределённые стили в единицах измерения

Форматирование физических величин использует стили short и long.

Globalize("ru").unitFormatter({
  unit: "kilometer-per-hour",
  style: "short"
})(120);

Short

Компактное обозначение единицы.

Пример:

  • 120 км/ч

Long

Полное текстовое представление.

Globalize("ru").unitFormatter({
  unit: "kilometer-per-hour",
  style: "long"
})(120);

Пример:

  • 120 километров в час

Связь стилей с CLDR

Каждый предопределённый стиль напрямую связан с набором данных CLDR:

  • datetime skeletons для дат
  • number patterns для чисел
  • currency symbols и accounting rules
  • unit display names

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


API доступа к предопределённым стилям

Использование стилей происходит через фабрики форматтеров:

Globalize(locale).dateFormatter({ datetime: "short" });
Globalize(locale).numberFormatter({ style: "currency", currency: "USD" });
Globalize(locale).unitFormatter({ unit: "liter", style: "long" });

Общий принцип:

  • объект конфигурации задаёт тип стиля
  • Globalize выбирает соответствующий шаблон из CLDR
  • возвращается функция форматирования

Различия между локалями

Одинаковый стиль может давать разные результаты:

Локаль short date
ru 27.05.26
en 5/27/26
de 27.05.26
Локаль currency (USD 100)
en $100.00
ru 100,00 $

Причина различий:

  • порядок компонентов
  • разделители
  • позиция символов
  • правила округления

Сопоставление стилей и сценариев использования

Даты и время

  • short — таблицы, интерфейсы, списки
  • medium — документы, формы
  • long — отчёты, письма
  • full — юридические и официальные тексты

Числа

  • decimal — общие вычисления и отображение значений
  • percent — статистика, прогресс
  • currency — финансовые данные
  • scientific — инженерные и научные расчёты
  • compact — интерфейсы с ограниченным пространством

Единицы

  • short — интерфейсы и панели
  • long — текстовые описания и отчёты

Особенности реализации и кэширование

Форматтеры в Globalize являются дорогостоящими объектами при создании, поэтому используется подход повторного использования:

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

Пример:

const formatCurrency = Globalize("ru").numberFormatter({
  style: "currency",
  currency: "KZT"
});

formatCurrency(1000);
formatCurrency(2500);

Ограничения и зависимость от данных CLDR

Предопределённые стили требуют полного набора CLDR данных:

  • даты (ca-gregorian)
  • числа (numbers)
  • валюты (currencies)
  • единицы (units)

Отсутствие данных приводит к деградации форматирования или ошибкам инициализации.

Стиль не является универсальным алгоритмом, а представляет собой ссылку на локализованное описание формата, определённое в CLDR.