Парсинг данных в Globalize строится вокруг преобразования строкового представления локализованных значений в машинные типы JavaScript с учётом правил конкретной локали. Основная сложность заключается в том, что одно и то же значение может иметь различные визуальные формы в разных регионах: числа используют разные разделители, даты имеют отличающиеся порядки компонентов, а денежные значения включают локальные обозначения валют и пробелы форматирования.
В основе работы парсеров лежит связка между форматированием и обратным преобразованием. Если форматтер отвечает за превращение числа или даты в строку, то парсер решает обратную задачу — восстановление исходного значения из локализованного текста.
Парсеры в Globalize опираются на данные CLDR (Unicode Common Locale Data Repository), которые содержат:
Ключевой принцип: парсинг невозможен без предварительно загруженных CLDR-данных, соответствующих используемой локали.
Парсинг чисел — одна из базовых операций, поскольку числовые значения часто вводятся пользователем в локализованном формате.
В разных локалях различаются:
. или ,);, или пробел);В Globalize для этого используется метод:
Globalize(locale).parseNumber(string);
Пример логики обработки:
"1,234.56" в en-US интерпретируется как
1234.56;"1 234,56" в ru-RU интерпретируется как
1234.56.Парсер выполняет:
Особенность заключается в строгой зависимости от локали: одна и та же строка может быть корректной в одной локали и некорректной в другой.
Парсинг валютных значений расширяет числовой парсинг за счёт обработки символов валют и их расположения относительно числа.
Форматы могут отличаться:
$1,000.00 (символ перед числом);1 000,00 € (символ после числа);USD 1,000.00 (код валюты);Метод:
Globalize(locale).parseCurrency(string);
Процесс включает:
определение валютного символа или кода;
извлечение числовой части;
обработку пробелов и неразрывных символов;
нормализацию результата в структуру вида:
Парсер валюты должен учитывать неоднозначность: некоторые символы могут пересекаться с математическими обозначениями или текстом.
Парсинг дат значительно сложнее числового, поскольку зависит не только от локали, но и от множества форматов представления:
MM/dd/yyyy (США);dd.MM.yyyy (Россия, Германия);yyyy-MM-dd (ISO-подобные форматы);Globalize использует:
Globalize(locale).parseDate(string, options);
Парсер даты выполняет последовательные этапы:
., /,
-, пробелы).Особую сложность представляют:
01/02/2020 — январь или
февраль);После разбора строка преобразуется в объект Date. При
этом важно учитывать, что JavaScript Date хранит значение в
UTC-основанной внутренней форме, а локаль влияет только на интерпретацию
входной строки.
Парсеры Globalize используют несколько стратегий сопоставления:
Ожидает полное соответствие формату локали. Любое отклонение приводит
к ошибке или null.
Позволяет:
Использует заранее определённые CLDR-шаблоны для сопоставления строки с возможными форматами.
Парсинг в Globalize невозможен без загрузки соответствующих наборов данных:
cldr-numbers-full — для чисел;cldr-dates-full — для дат;cldr-currencies-full — для валют.Отсутствие данных приводит к невозможности корректного разбора даже формально правильных строк.
CLDR определяет:
Типичные проблемы при работе с парсерами:
Строка сформирована в одной локали, а парсится в другой.
Отсутствие необходимых сегментов данных приводит к невозможности распознавания формата.
Строки, которые могут быть интерпретированы несколькими способами.
Дополнительные символы, сокращения или опечатки, не предусмотренные CLDR.
Парсинг в Globalize включает:
Наиболее затратной операцией является парсинг дат, так как он требует анализа множества возможных шаблонов.
Оптимизация достигается за счёт:
Ключевая особенность Globalize заключается в симметрии операций:
Однако полная обратимость не гарантируется, поскольку:
Логика работы можно представить как последовательность:
Такой подход обеспечивает предсказуемость обработки данных в многоязычных интерфейсах, где ввод пользователя не ограничен единым форматом представления информации.