Стили представления

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

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


Базовая модель стилей числового форматирования

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

Основные категории:

  • decimal — обычное представление числа
  • percent — проценты
  • currency — валютные значения
  • scientific — научная нотация
  • compact — сокращённые формы (например, 1K, 1M)

Каждый стиль влияет на три ключевых аспекта:

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

Десятичный стиль (decimal)

Десятичный стиль используется как базовый и применяется для большинства числовых значений без дополнительной семантики.

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

numberFormatter(12345.678);
// "12,345.678" (в зависимости от локали)

Поведение зависит от локали:

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

Десятичный стиль является базой, на которой строятся остальные представления.


Процентный стиль (percent)

Процентный стиль масштабирует значение и добавляет символ процента в соответствии с локальными правилами.

const percentFormatter = Globalize.numberFormatter({ style: "percent" });

percentFormatter(0.25);
// "25%"

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

  • входное значение интерпретируется как доля (0–1)
  • происходит автоматическое умножение на 100
  • знак процента может иметь разные пробелы и позиции

Процентный стиль часто используется в статистике, финансовых отчётах и UI-индикаторах.


Валютный стиль (currency)

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

  • код валюты
  • правила округления
  • локальные символы
  • формат отрицательных значений
const currencyFormatter = Globalize.numberFormatter({
  style: "currency",
  currency: "USD"
});

currencyFormatter(1234.5);
// "$1,234.50"

Ключевые параметры:

  • currency — обязательный ISO-код валюты
  • minimumFractionDigits и maximumFractionDigits — контроль точности
  • round — стратегия округления

Форматы валютного отображения

В рамках валютного стиля существует несколько подрежимов отображения:

Символьное представление

Использует локальный символ валюты:

Globalize.numberFormatter({
  style: "currency",
  currency: "EUR"
});

Результат зависит от локали:

  • €1,234.56
  • 1.234,56 €

Код валюты

Отображение через ISO-код:

Globalize.numberFormatter({
  style: "currency",
  currency: "USD",
  currencyDisplay: "code"
});

Пример:

  • USD 1,234.50

Полное название валюты

Globalize.numberFormatter({
  style: "currency",
  currency: "USD",
  currencyDisplay: "name"
});

Результат:

  • 1,234.50 US dollars

Accounting-стиль

Accounting-режим влияет на отображение отрицательных значений:

Globalize.numberFormatter({
  style: "currency",
  currency: "USD",
  currencySign: "accounting"
});

Отрицательные значения могут отображаться как:

  • (1,234.50) вместо:
  • -1,234.50

Научный стиль (scientific)

Научный стиль используется для очень больших или очень маленьких чисел.

const sciFormatter = Globalize.numberFormatter({
  style: "scientific"
});

sciFormatter(1234567);
// "1.234567E6"

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

  • экспоненциальная форма
  • контроль значащих цифр
  • локализация символа экспоненты

Компактный стиль (compact)

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

const compactFormatter = Globalize.numberFormatter({
  style: "decimal",
  notation: "compact"
});

compactFormatter(1200);
// "1K"

Разновидности:

  • short: 1K, 1M, 1B
  • long: 1 thousand, 1 million

Компактный стиль активно используется в интерфейсах аналитики и социальных метрик.


Стили представления дат и времени

Форматирование дат в Globalize основано на CLDR-шаблонах и поддерживает несколько стандартных уровней детализации.

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

dateFormatter(new Date());
// "27.05.26" (пример для локали)

Основные стили:

  • short — минимальный формат
  • medium — сбалансированный
  • long — расширенный формат с названием месяца
  • full — максимально подробный формат

Стили времени

Временные форматы отделяются от дат:

const timeFormatter = Globalize.dateFormatter({ time: "short" });

timeFormatter(new Date());
// "14:35"

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

  • 12/24-часовые форматы зависят от локали
  • поддержка секунд в расширенных режимах
  • локализованные обозначения AM/PM

Комбинированные стили даты и времени

Можно объединять стили:

const datetimeFormatter = Globalize.dateFormatter({
  datetime: "medium"
});

datetimeFormatter(new Date());
// "27 мая 2026, 14:35"

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


Относительное время (relative time)

Относительные стили используются для выражений типа «через 5 минут» или «2 дня назад».

const relativeFormatter = Globalize.relativeTimeFormatter("day");

relativeFormatter(-2);
// "2 дня назад"

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

  • поддержка направлений (прошлое/будущее)
  • единицы измерения (секунды, минуты, часы, дни)
  • локализованные грамматические формы

Стили единиц измерения

Форматирование единиц основано на CLDR units.

const unitFormatter = Globalize.unitFormatter({
  unit: "kilometer-per-hour"
});

unitFormatter(120);
// "120 km/h"

Типы представления:

  • narrow: 120km/h
  • short: 120 km/h
  • long: 120 kilometers per hour

Согласование стилей с локалью

Все стили представления зависят от загруженных данных локали:

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

Без корректно загруженного CLDR-датасета стили либо не работают, либо возвращают упрощённые значения.


Пользовательские стили и переопределение шаблонов

Хотя Globalize опирается на стандартизированные стили, допускается частичная кастомизация через параметры форматирования.

Пример изменения точности:

Globalize.numberFormatter({
  style: "decimal",
  minimumFractionDigits: 2,
  maximumFractionDigits: 4
});

Поведение:

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

Взаимодействие стилей с округлением

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

Globalize.numberFormatter({
  style: "currency",
  currency: "USD",
  round: "ceil"
});

Возможные стратегии:

  • floor
  • ceil
  • round
  • truncate

Каждая стратегия влияет на итоговое визуальное представление, особенно в валютных и процентных стилях.


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

При форматировании значения применяется последовательность правил:

  1. выбор локали
  2. выбор стиля (currency, percent, decimal и т.д.)
  3. применение CLDR-шаблона
  4. применение пользовательских параметров
  5. округление и финальное форматирование

Эта цепочка обеспечивает предсказуемость результата при любых комбинациях настроек.


Контекстное использование стилей

Стили представления используются в разных слоях приложения:

  • UI-компоненты (таблицы, графики)
  • финансовые расчёты
  • аналитические панели
  • уведомления и логи
  • временные метки событий

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