Создание собственных локалей

Система локалей в AutoNumeric строится вокруг набора правил форматирования чисел, определяющих визуальное представление данных: разделители разрядов, десятичный символ, поведение отрицательных значений, префиксы и суффиксы, правила группировки и округления. Локаль в этом контексте представляет собой конфигурационный объект, который описывает региональные соглашения отображения чисел без изменения их внутреннего числового значения.

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


Структура локали и ключевые параметры форматирования

Каждая локаль в AutoNumeric описывается набором параметров, влияющих на форматирование строки отображения числа:

Основные элементы локали

  • decimalCharacter — символ десятичного разделителя
  • digitGroupSeparator — символ группировки разрядов
  • decimalCharacterAlternative — альтернативный десятичный символ (используется при вводе)
  • digitGroupSpacing — стратегия группировки цифр
  • currencySymbol — символ валюты или текстовый префикс/суффикс
  • currencySymbolPlacement — позиция символа (prefix / suffix)
  • negativePositiveSignPlacement — расположение знака числа
  • minimumValue / maximumValue — диапазон допустимых значений
  • roundingMethod — метод округления
  • decimalPlaces — фиксированное число знаков после запятой или режим автоопределения

Принципы создания пользовательской локали

Создание собственной локали сводится к формированию конфигурационного объекта, который либо расширяет существующую локаль, либо определяет новую полностью.

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


Базовая кастомная локаль

Минимальная пользовательская локаль определяется через переопределение базовых символов:

const customLocale = {
    decimalCharacter: ',',
    digitGroupSeparator: ' ',
    decimalCharacterAlternative: '.',
    currencySymbol: '₸ ',
    currencySymbolPlacement: 'p',
    roundingMethod: 'S',
    minimumValue: '-999999999',
    maximumValue: '999999999'
};

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


Наследование и расширение локалей

Механизм расширения позволяет использовать существующую конфигурацию как основу и переопределять только необходимые поля.

const baseLocale = {
    decimalCharacter: '.',
    digitGroupSeparator: ',',
    currencySymbol: '$ ',
    currencySymbolPlacement: 'p'
};

const extendedLocale = {
    ...baseLocale,
    decimalCharacter: ',',
    digitGroupSeparator: ' ',
    currencySymbol: '€ ',
    currencySymbolPlacement: 's'
};

Такой подход обеспечивает консистентность поведения при сохранении гибкости региональных изменений.


Поддержка сложных правил группировки

AutoNumeric позволяет задавать нестандартные схемы группировки разрядов, включая азиатские и смешанные форматы.

Пример индийской системы группировки

const indianLocale = {
    decimalCharacter: '.',
    digitGroupSeparator: ',',
    digitGroupSpacing: '2s',
    currencySymbol: '₹ ',
    currencySymbolPlacement: 'p'
};

Здесь применяется правило 2s, означающее:

  • первая группа: 3 цифры
  • последующие группы: по 2 цифры

Это соответствует стандарту 1,00,00,000.


Интеграция локали при инициализации

Пользовательская локаль применяется на этапе создания экземпляра форматтера:

new AutoNumeric('#input', {
    ...customLocale,
    decimalPlaces: 2,
    modifyValueOnWheel: false
});

При таком подходе локаль становится частью конфигурации экземпляра и не требует глобальной регистрации.


Глобальная регистрация пользовательских локалей

При масштабных приложениях локали могут быть зарегистрированы как переиспользуемые конфигурации:

AutoNumeric.setLocale('customEU', {
    decimalCharacter: ',',
    digitGroupSeparator: '.',
    currencySymbol: '€ ',
    currencySymbolPlacement: 's',
    roundingMethod: 'H'
});

После регистрации локаль доступна по ключу:

new AutoNumeric('#price', 'customEU');

Поведение при вводе и нормализация значений

Локаль влияет не только на отображение, но и на интерпретацию пользовательского ввода. При этом различаются:

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

Пример неоднозначного ввода

Для локали с запятой как десятичным разделителем:

1.234,56

будет интерпретировано как:

1234.56

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


Кастомные валютные локали

Локали часто используются для описания валютных форматов с различными позициями символов:

Префиксная модель

const usdPrefix = {
    decimalCharacter: '.',
    digitGroupSeparator: ',',
    currencySymbol: '$ ',
    currencySymbolPlacement: 'p'
};

Суффиксная модель

const eurSuffix = {
    decimalCharacter: ',',
    digitGroupSeparator: ' ',
    currencySymbol: ' €',
    currencySymbolPlacement: 's'
};

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


Управление округлением в локалях

Параметр roundingMethod задаёт поведение при усечении значений:

  • S — симметричное округление
  • A — округление вверх
  • X — округление вниз
  • B — банковское округление

Пример локали с банковским округлением:

const accountingLocale = {
    decimalCharacter: '.',
    digitGroupSeparator: ',',
    roundingMethod: 'B',
    decimalPlaces: 2
};

Ограничения значений внутри локали

Локаль может фиксировать допустимый диапазон чисел, что используется для форм ввода:

const constrainedLocale = {
    decimalCharacter: '.',
    digitGroupSeparator: ',',
    minimumValue: '0',
    maximumValue: '1000000'
};

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


Поведение альтернативного десятичного символа

Параметр decimalCharacterAlternative позволяет обрабатывать ввод с разных клавиатурных раскладок:

const flexibleLocale = {
    decimalCharacter: ',',
    decimalCharacterAlternative: '.',
    digitGroupSeparator: ' '
};

Это обеспечивает корректную обработку как европейского, так и американского формата ввода без дополнительной логики на уровне приложения.


Композиция локалей в крупных системах

В сложных приложениях локали формируются как композиции:

  • базовая математическая модель
  • региональный слой
  • доменный слой (финансы, аналитика, отчётность)

Пример композиции:

const base = {
    decimalCharacter: '.',
    digitGroupSeparator: ','
};

const region = {
    decimalCharacter: ',',
    digitGroupSeparator: ' '
};

const finance = {
    currencySymbol: '₸ ',
    currencySymbolPlacement: 'p',
    roundingMethod: 'H'
};

const composedLocale = {
    ...base,
    ...region,
    ...finance
};

Поведение локалей при динамическом изменении

Локали могут изменяться во время работы интерфейса без пересоздания DOM-элемента:

anInstance.set({
    decimalCharacter: ',',
    digitGroupSeparator: '.'
});

При этом сохраняется текущее значение, но пересчитывается отображение.


Типовые ошибки при создании локалей

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

Архитектурная роль локалей в системе форматирования

Локали в AutoNumeric выступают как слой абстракции между:

  • пользовательским вводом
  • внутренним числовым представлением
  • визуальным отображением

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