Globalize строится вокруг идеи многоэтапной нормализации и форматирования данных, где каждое преобразование выполняет строго ограниченную задачу. Вместо монолитных функций используется композиция операций: входное значение проходит через последовательность шагов, на каждом из которых учитываются локаль, тип данных и правила CLDR.
Базовый принцип заключается в разделении процессов на три уровня:
Эта последовательность формирует основу цепочек преобразований, где результат одного этапа становится входом следующего.
Цепочка преобразований в контексте Globalize — это не обязательно синтаксическая конструкция, а логическая модель обработки данных:
input → parse → internal representation → transform → format → output
Каждый шаг использует данные CLDR (Unicode Common Locale Data Repository), обеспечивающие корректность локализации для чисел, дат, валют и единиц измерения.
Особенность подхода заключается в том, что каждый этап изолирован, но полностью совместим с другими, что позволяет комбинировать их в произвольных конфигурациях.
Парсинг отвечает за интерпретацию строкового ввода. Например, строка с числом в локализованном формате должна быть приведена к числовому значению:
На этом этапе данные ещё не пригодны для вычислений, но уже структурированы.
После парсинга данные приводятся к стандартному виду. Это позволяет устранить различия между локалями:
Нормализация выступает связующим звеном между локализованным вводом и универсальной внутренней моделью.
Форматирование преобразует нормализованные данные в строку, соответствующую локали:
Этот этап зависит от локали и может радикально менять внешний вид результата при одинаковых входных данных.
Числовые операции демонстрируют базовую модель последовательных преобразований.
Процесс можно представить следующим образом:
"1 234,56" → parseNumber → 1234.56 → математическая операция → formatNumber → "1.234,56"
Каждый этап независим:
Это позволяет переиспользовать этапы в различных комбинациях.
Работа с датами в Globalize особенно наглядно демонстрирует принцип многоступенчатой обработки:
"31/12/2026" → parseDate → Date → addDays → Date → formatDate → "01.01.2027"
Здесь цепочка включает не только преобразование формата, но и промежуточную трансформацию значения.
Ключевые стадии:
Обработка валютных данных включает дополнительные уровни семантики:
"1 000,00 €" → parseCurrency → 1000 → convertCurrency → 1080 → formatCurrency → "1.080,00 $"
Здесь цепочка расширяется за счет этапа конвертации:
Каждый шаг сохраняет чистоту ответственности и не зависит от локали предыдущего этапа.
Цепочки преобразований становятся особенно мощными при композиции функций. Вместо одного вызова можно строить последовательность:
Пример логической композиции:
formatNumber(
round(
convert(
parseNumber(input)
)
)
)
Несмотря на вложенность, каждый уровень остаётся независимым модулем.
Ключевым элементом цепочек является промежуточное представление, которое не зависит от локали. Оно обеспечивает:
Такие представления включают:
Локаль не является частью данных, она становится параметром каждого этапа цепочки:
Это разделение позволяет выполнять одинаковые операции над данными независимо от региона, изменяя только финальное представление.
Нарушение последовательности преобразований приводит к некорректным результатам:
Такие ошибки возникают при пропуске этапа нормализации, когда данные не приводятся к единому виду перед вычислениями.
Цепочки преобразований в Globalize могут быть расширены дополнительными этапами:
Пример расширенной цепочки:
input → validate → parse → normalize → transform → round → format → output
Каждый дополнительный шаг не нарушает структуру, а лишь вставляется в существующий поток обработки.
В сложных сценариях данные могут проходить несколько цепочек одновременно:
Все они используют один и тот же источник данных, но различаются этапами форматирования и преобразования.
Последовательная модель обработки обеспечивает детерминированность:
Это особенно важно при обработке финансовых и временных данных, где точность и повторяемость критичны.