Локальные форматы данных в разных языках и регионах отличаются не только визуально, но и по правилам интерпретации. Одна и та же строка может означать разные числовые или временные значения в зависимости от культурных соглашений. Библиотека Globalize решает задачу распознавания таких форматов через слой локализации, основанный на данных CLDR, обеспечивая корректный разбор пользовательского ввода.
Распознавание локальных форматов строится вокруг двух процессов:
Именно второй процесс критичен для обработки пользовательского ввода, поскольку он требует учета локальных правил:
Globalize использует данные CLDR для построения правил разбора, а не эвристики, что обеспечивает предсказуемость поведения.
Числа — наиболее частый тип локализованного ввода. Различия между локалями касаются десятичного и тысячного разделителей.
Примеры:
1,234.56 (en-US)1.234,56 (de-DE)1 234,56 (fr-FR)В Globalize разбор выполняется через parseNumber,
который учитывает текущую локаль:
Globalize.locale("de");
const value = Globalize.parseNumber("1.234,56");
console.log(value); // 1234.56
Механика разбора:
При разборе чисел важно учитывать не только символы, но и их контекст:
Пример:
Globalize.locale("fr");
Globalize.parseNumber("−1 234,50"); // -1234.5
Здесь используется не стандартный ASCII-минус, а Unicode-минус, а также неразрывный пробел как разделитель групп.
Форматы валют включают числовую часть и символ валюты, который может располагаться до или после числа.
Особенности:
$1,000.00 (en-US)1 000,00 € (fr-FR)€1.000,00 (de-DE)В Globalize разбор валют учитывает локальный шаблон:
Globalize.locale("de");
const amount = Globalize.parseNumber("1.000,00 €");
console.log(amount); // 1000
При этом символ валюты удаляется на этапе нормализации, но его позиция используется для идентификации формата.
Даты представляют более сложный случай из-за вариативности порядка компонентов.
Сравнение:
12/31/2025 (en-US)31.12.2025 (ru-RU, de-DE)2025-12-31 (ISO)В Globalize разбор дат выполняется через CLDR-основанные шаблоны:
Globalize.locale("ru");
const date = Globalize.parseDate("31.12.2025");
console.log(date); // Date object
Механизм включает:
Globalize различает несколько уровней формата:
Разбор всегда опирается на соответствующий шаблон:
Globalize.locale("ru");
Globalize.parseDate("31 декабря 2025 г.");
Некоторые строки могут быть неоднозначны без локального контекста:
01/02/2025 → 1 февраля или 2 января10-11-12 → разные интерпретации порядкаGlobalize устраняет неоднозначность через:
Это принципиально отличает библиотеку от простых парсеров, которые пытаются «угадать» формат.
Некоторые локали используют нестандартные символы:
Globalize приводит все символы к нормализованному виду перед парсингом:
Globalize.locale("ar");
Globalize.parseNumber("١٬٢٣٤٫٥٦");
Результат:
1234.56
CLDR (Unicode Common Locale Data Repository) является основным источником правил:
Globalize использует CLDR как неизменяемую базу, исключая необходимость ручной настройки форматов.
При работе с формами важно учитывать:
Типичный поток:
Некоторые случаи требуют осторожности:
Пример проблемного ввода:
"около 1.000 евро"
Такие строки не могут быть корректно разобраны без предварительной очистки, поскольку библиотека работает с формализованными локальными шаблонами, а не с естественным языком.
Ключевая характеристика механизма распознавания:
Это делает поведение предсказуемым в разных средах выполнения JavaScript и облегчает тестирование прикладной логики.