Локализация числового формата в AutoNumeric строится вокруг набора параметров форматирования, которые определяют визуальное представление числа в поле ввода. Ключевыми элементами выступают разделитель тысяч, десятичный символ, правила группировки разрядов, отображение валютных символов и особенности отрицательных значений. Переключение между локалями фактически сводится к динамической замене набора этих параметров с последующим перерасчётом отображаемого значения без изменения его внутреннего числового представления.
В AutoNumeric локаль не является отдельной сущностью уровня «locale
string» в духе ru-RU или en-US. Вместо этого
используется конфигурационный объект, определяющий правила
форматирования:
Типовая локализация может быть представлена следующим образом:
const localeUS = {
digitGroupSeparator: ',',
decimalCharacter: '.',
decimalCharacterAlternative: '.',
currencySymbol: '$',
currencySymbolPlacement: 'p',
negativeSignCharacter: '-'
};
const localeEU = {
digitGroupSeparator: '.',
decimalCharacter: ',',
decimalCharacterAlternative: ',',
currencySymbol: '€',
currencySymbolPlacement: 's',
negativeSignCharacter: '-'
};
Несмотря на внешнюю простоту, эти параметры определяют всю модель взаимодействия пользователя с числовым вводом.
AutoNumeric хранит значение отдельно от его отображения. Это
означает, что переключение локали не влияет на числовую сущность данных.
Например, значение 12345.67 остаётся тем же числом,
независимо от того, отображается ли оно как:
12,345.67 (US формат)12.345,67 (EU формат)При смене локали происходит только перерасчёт строки отображения и позиции курсора.
Переключение локали осуществляется через обновление конфигурации уже существующего экземпляра AutoNumeric. Основной принцип — повторное применение параметров форматирования:
const anElement = new AutoNumeric('#input', localeUS);
// переключение на европейский формат
anElement.update(localeEU);
Метод обновления пересчитывает текущее значение и перерисовывает содержимое input без потери данных.
В реальных приложениях локали обычно хранятся в виде набора профилей. Такой подход позволяет централизовать правила форматирования:
const locales = {
us: {
digitGroupSeparator: ',',
decimalCharacter: '.',
currencySymbol: '$',
currencySymbolPlacement: 'p'
},
de: {
digitGroupSeparator: '.',
decimalCharacter: ',',
currencySymbol: '€',
currencySymbolPlacement: 's'
},
fr: {
digitGroupSeparator: ' ',
decimalCharacter: ',',
currencySymbol: '€',
currencySymbolPlacement: 's'
}
};
Дальнейшее переключение сводится к выбору объекта конфигурации:
function switchLocale(anElement, localeKey) {
anElement.update(locales[localeKey]);
}
При смене локали важным этапом является перерасчёт текущего отображаемого значения. AutoNumeric выполняет следующие шаги:
Этот процесс критичен для сохранения UX при активном вводе.
Особенность переключения локалей во время редактирования заключается
в необходимости сохранения контекста ввода. Например, при наборе числа
1234.5 в американском формате и переключении на европейский
формат возникает необходимость преобразования:
1,234.5 → 1.234,5AutoNumeric решает это через внутреннюю нормализацию значения перед повторным форматированием. При этом вводимые пользователем символы сначала интерпретируются как число, затем преобразуются в строку по новым правилам.
Для повышения устойчивости к различным локалям вводимых данных используется параметр альтернативного десятичного символа:
decimalCharacterAlternative: ','
Это позволяет вводить число 12.5 или 12,5 в
зависимости от клавиатурной раскладки, при этом внутреннее значение
остаётся одинаковым. При переключении локали этот механизм сохраняется,
что предотвращает ошибки парсинга.
В сценариях с несколькими полями применяется групповое обновление экземпляров AutoNumeric:
const instances = AutoNumeric.multiple('.price-input', localeUS);
function switchAllLocales(localeConfig) {
instances.forEach(instance => {
instance.update(localeConfig);
});
}
Такой подход важен для таблиц, форм заказов и финансовых интерфейсов, где все поля должны синхронно изменять формат отображения.
Часто переключение локали связано не только с UI, но и с правилами обработки данных. Например:
AutoNumeric ограничивается визуальным уровнем, но переключение конфигурации часто синхронизируется с внешними сервисами форматирования.
Если локаль изменяется до инициализации экземпляра, параметры применяются при создании:
const anElement = new AutoNumeric('#input', locales.de);
Если локаль изменяется после инициализации, используется обновление:
anElement.update(locales.fr);
Разница между этими подходами заключается в моменте пересчёта DOM-значения и позиции курсора.
Многократное переключение локалей не приводит к накоплению ошибок округления, поскольку AutoNumeric оперирует внутренним числом, а не строковым представлением. Каждое переключение выполняет преобразование:
внутреннее число → формат локали → отображение
без обратного накопления преобразований строки.
При сложных сценариях могут проявляться особенности:
decimalCharacterAlternative;Эти аспекты требуют согласованности всех локальных конфигураций, чтобы переключение не изменяло семантику данных.
В приложениях с серверной конфигурацией локаль часто приходит как часть пользовательских настроек:
fetch('/api/user-settings')
.then(res => res.json())
.then(settings => {
anElement.update(locales[settings.locale]);
});
В таких сценариях критично обеспечить соответствие между серверным обозначением локали и локальным конфигурационным объектом.
При переключении между локалями во время ввода возможно появление промежуточных состояний строки. AutoNumeric нормализует такие состояния, интерпретируя их как частично введённое число и пересобирая отображение после каждого изменения конфигурации.
Это предотвращает накопление неконсистентных символов вроде
одновременно присутствующих , и . в одном
значении.
При смене локали важно, что элемент ввода остаётся в фокусе. Перерисовка значения выполняется без blur/focus событий, что позволяет сохранять непрерывность ввода и положение курсора. Это достигается через внутренние механизмы сохранения selection range до обновления и восстановления после форматирования.