Базовое форматирование целых чисел

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

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

Ключевой принцип заключается в том, что форматирование не изменяет само число, а трансформирует его строковое представление с учётом локали:

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

Форматирование осуществляется через Globalize.numberFormatter.

Инициализация окружения Globalize

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

import Globalize from "globalize";
import cldrData from "cldr-data";

// загрузка необходимых частей CLDR
Globalize.load(
  cldrData.entireSupplemental(),
  cldrData.entireMainFor("ru", "en")
);

// установка локали
const ru = new Globalize("ru");

Набор данных CLDR определяет правила для конкретной локали, включая группировку разрядов и символы разделителей.

Базовый форматтер целых чисел

Форматирование целых чисел реализуется через отключение дробной части. Основной параметр — maximumFractionDigits: 0.

const formatter = ru.numberFormatter({
  maximumFractionDigits: 0
});

formatter(1234567);

Результат для локали ru:

1 234 567

Для локали en:

1,234,567

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

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

Поведение при разных локалях

Русская локаль

const ru = new Globalize("ru");

const fmt = ru.numberFormatter({ maximumFractionDigits: 0 });

fmt(1002003004);

Результат:

1 002 003 004

Группировка выполняется по три цифры справа налево.

Немецкая локаль

const de = new Globalize("de");

const fmt = de.numberFormatter({ maximumFractionDigits: 0 });

fmt(1002003004);

Результат:

1.002.003.004

Используется точка как разделитель тысяч.

Английская локаль

const en = new Globalize("en");

const fmt = en.numberFormatter({ maximumFractionDigits: 0 });

fmt(1002003004);

Результат:

1,002,003,004

Управление группировкой разрядов

Форматирование целых чисел может быть изменено через параметр useGrouping.

const fmt = ru.numberFormatter({
  maximumFractionDigits: 0,
  useGrouping: false
});

fmt(1002003004);

Результат:

1002003004

Отключение группировки используется при:

  • идентификаторах
  • серийных номерах
  • внутренних технических значениях

Отрицательные целые числа

Отрицательные значения обрабатываются через локализованный символ минуса.

const fmt = ru.numberFormatter({
  maximumFractionDigits: 0
});

fmt(-123456);

Результат:

-123 456

В некоторых локалях возможны отличия символа минуса (например, U+2212 вместо ASCII дефиса).

Минимальная ширина отображения

Форматирование поддерживает выравнивание числа по разрядам через параметр minimumIntegerDigits.

const fmt = ru.numberFormatter({
  minimumIntegerDigits: 6,
  maximumFractionDigits: 0
});

fmt(123);

Результат:

000123

Такой механизм используется для:

  • кодов фиксированной длины
  • идентификаторов
  • временных меток без разделителей

Комбинация параметров форматирования

Целые числа могут форматироваться с одновременным применением нескольких ограничений.

const fmt = en.numberFormatter({
  minimumIntegerDigits: 5,
  useGrouping: true,
  maximumFractionDigits: 0
});

fmt(42);

Результат:

00,042

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

Поведение при больших числах

Для значений, превышающих стандартные диапазоны JavaScript Number, форматирование сохраняет точность только в пределах безопасного диапазона Number.MAX_SAFE_INTEGER.

const fmt = en.numberFormatter({
  maximumFractionDigits: 0
});

fmt(9007199254740991);

Результат:

9,007,199,254,740,991

При выходе за пределы точного представления возможны потери точности, обусловленные спецификой IEEE 754.

Влияние CLDR на форматирование

Globalize использует CLDR для определения:

  • символа разделителя групп
  • правил группировки (3-3, 4-4 и смешанные схемы)
  • знака отрицательных чисел
  • набора цифр (включая локализованные системы записи)

Пример различий группировки:

  • en: 1,234,567
  • hi (хинди): 12,34,567
const hi = new Globalize("hi");

const fmt = hi.numberFormatter({
  maximumFractionDigits: 0
});

fmt(1234567);

Результат:

12,34,567

Особенности работы с нулём

Нулевое значение форматируется согласно тем же правилам локали.

const fmt = ru.numberFormatter({
  maximumFractionDigits: 0
});

fmt(0);

Результат:

0

При использовании minimumIntegerDigits ноль может быть дополнен ведущими нулями:

000000

Сравнение с Intl.NumberFormat

Модель Globalize функционально близка к Intl.NumberFormat, однако отличается архитектурой:

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

Пример аналогичного поведения:

new Intl.NumberFormat("ru", {
  maximumFractionDigits: 0
}).format(1234567);

Результат совпадает с Globalize:

1 234 567

Использование в прикладных сценариях

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

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

Стабильность форматирования обеспечивается неизменностью CLDR-правил при одинаковой версии данных, что критично для серверных и распределённых систем отображения.