В библиотеке Globalize обработка группировщиков разрядов является частью подсистемы форматирования чисел и тесно связана с локализацией числовых представлений. Группировщик разрядов (grouping separator) определяет, каким символом и с какой периодичностью разделяются разряды числа при отображении, а также как эти символы интерпретируются при обратном разборе строки в число.
В разных локалях используются различные символы и правила группировки:
en-US (1,234,567)ru-RU (1 234 567)Globalize опирается на данные Unicode CLDR, где для каждой локали определены:
Группировка разрядов описывается через паттерн числа, в котором задаётся регулярность вставки разделителя. Например:
3;3Некоторые локали используют асимметричную модель:
первая группа меньше или больше последующих
пример: индийская система 12,34,56,789, где:
Globalize интерпретирует эти данные через CLDR-модель, где группировка задаётся массивом:
"group": [3, 2]
или через строковое представление:
"3;2"
Основной механизм форматирования реализуется через
numberFormatter. При вызове форматтера учитываются:
Пример инициализации форматтера:
import Globalize from "globalize";
Globalize.load(
require("cldr-data").entireSupplemental(),
require("cldr-data").entireMainFor("ru")
);
const globalize = new Globalize("ru");
const formatter = globalize.numberFormatter();
Форматирование числа:
formatter(1234567);
// "1 234 567"
Здесь используется неразрывный пробел как группировщик, что предотвращает разрыв числа при переносе строки.
Символ группировщика определяется через CLDR-свойство
symbols-numberSystem-*, например:
group — основной разделитель разрядовdecimal — десятичный разделительДля русской локали:
{
"group": " ",
"decimal": ","
}
Globalize не фиксирует символы, а извлекает их из CLDR, что обеспечивает корректное поведение для любых локалей без ручной настройки.
При форматировании числа выполняются следующие шаги:
Число преобразуется в строку без форматирования
Отделяется целая часть от дробной
Целая часть разворачивается справа налево
Применяется правило группировки:
В позиции разрядов вставляется символ группировки
Строка возвращается в нормальный порядок
Пример для числа 987654321:
9876543213;3987,654,321 или 987 654 321 в
зависимости от локалиОсобенность индийской системы — различие первой и последующих групп:
12,34,56,789
Globalize обрабатывает это через CLDR:
"group": [3, 2]
Алгоритм:
Результат:
const globalize = new Globalize("hi");
const formatter = globalize.numberFormatter();
formatter(123456789);
// "12,34,56,789"
В арабских локалях символ группировки может отличаться визуально:
Globalize учитывает bidi-направление и корректно размещает разделители в строке, не нарушая порядок чисел.
Обратная операция — numberParser — учитывает
локализованные группировщики при преобразовании строки в число.
const parser = globalize.numberParser();
parser("1 234 567");
// 1234567
Особенности:
При парсинге Globalize выполняет нормализацию входной строки:
Это критично для пользовательского ввода, где могут использоваться:
Группировщики разрядов не влияют на числовое значение, однако могут повлиять на:
Globalize исключает эти проблемы за счёт строгой привязки к CLDR-данным.
При использовании кастомных форматов:
const formatter = globalize.numberFormatter({
minimumFractionDigits: 0,
maximumFractionDigits: 0
});
группировка сохраняется автоматически, если явно не отключена.
Отключение группировки:
const formatter = globalize.numberFormatter({
useGrouping: false
});
Результат:
formatter(1234567);
// "1234567"
Группировка применяется только к целой части числа. Дробная часть:
Пример:
formatter(1234567.89);
// "1 234 567,89"
Globalize поддерживает альтернативные числовые системы CLDR:
Группировка сохраняется, но цифры заменяются согласно системе:
const arabic = new Globalize("ar");
arabic.numberFormatter()(1234567);
// "١٬٢٣٤٬٥٦٧"
При форматировании валют:
Пример:
const formatter = globalize.currencyFormatter("USD");
formatter(1234567);
// "$1 234 567.00"
Группировка реализована через предрасчитанные паттерны CLDR, что позволяет:
Основная нагрузка приходится на:
Типичные проблемы:
en-US и
ru-RU)Globalize предотвращает такие ошибки за счёт строгой модели локализации и централизованных данных.