Библиотека AutoNumeric построена вокруг декларативной модели конфигураций, где поведение инпута определяется набором опций. Пользовательские правила в этом контексте представляют собой слой абстракции над базовыми настройками, позволяющий формализовать бизнес-логику форматирования, ограничений ввода и преобразования значений.
Основной принцип заключается в том, что любое правило сводится к изменению поведения одной или нескольких опций AutoNumeric либо к добавлению логики вокруг жизненного цикла значения: ввод, редактирование, отображение, получение raw-значения.
В AutoNumeric нет отдельной сущности «rule engine». Вместо этого пользовательские правила реализуются через композицию конфигурационных объектов.
Каждое правило формируется как объект опций:
const moneyRule = {
decimalCharacter: ',',
digitGroupSeparator: ' ',
decimalPlaces: 2,
currencySymbol: '₽',
currencySymbolPlacement: 's'
};
Такой объект становится атомарным правилом, которое может быть применено к одному или нескольким полям ввода.
Ключевой принцип: правило = конфигурация + контекст применения.
При росте приложения появляется необходимость централизовать правила. Для этого формируются фабрики конфигураций.
function createCurrencyRule({ symbol, decimals = 2 }) {
return {
decimalCharacter: '.',
digitGroupSeparator: ',',
decimalPlaces: decimals,
currencySymbol: symbol,
currencySymbolPlacement: 'p'
};
}
Использование:
const usdRule = createCurrencyRule({ symbol: '$', decimals: 2 });
const eurRule = createCurrencyRule({ symbol: '€', decimals: 2 });
Такой подход позволяет стандартизировать поведение полей без дублирования конфигураций.
AutoNumeric не поддерживает классическое наследование конфигураций, но композиция достигается через объединение объектов.
const baseNumberRule = {
digitGroupSeparator: ' ',
decimalCharacter: '.',
decimalPlaces: 2
};
const strictPositiveRule = {
...baseNumberRule,
minimumValue: '0'
};
Композиция позволяет строить иерархию правил:
В реальных интерфейсах правила часто зависят от состояния приложения. AutoNumeric позволяет изменять конфигурацию на лету через методы экземпляра.
const an = new AutoNumeric('#input', baseNumberRule);
if (isAdminMode) {
an.update({
decimalPlaces: 4
});
}
Такой подход формирует динамическое правило, где итоговое поведение определяется текущим состоянием системы.
Часть пользовательских правил связана с ограничением допустимого ввода. AutoNumeric предоставляет механизмы контроля значений через параметры минимального и максимального диапазона.
const boundedRule = {
minimumValue: '10',
maximumValue: '1000'
};
Эти ограничения работают на уровне логики библиотеки, блокируя выход за пределы допустимого диапазона при вводе и вставке значений.
При работе с буфером обмена часто требуется нормализация входных данных.
const pasteNormalizationRule = {
onInvalidPaste: 'truncate'
};
Данное правило определяет стратегию обработки некорректного вставленного значения: игнорирование, обрезка или преобразование.
Пользовательские правила на этом уровне позволяют адаптировать поведение под внешние источники данных (Excel, API, пользовательский ввод).
Локализация является одним из основных сценариев пользовательских правил. Она определяет формат отображения числа.
const ruLocaleRule = {
decimalCharacter: ',',
digitGroupSeparator: ' ',
currencySymbol: '₽',
currencySymbolPlacement: 's'
};
Такие правила часто группируются по регионам:
Это позволяет централизованно управлять форматированием в многоязычных интерфейсах.
AutoNumeric хранит значение в двух формах: отображаемой и сырой (raw). Пользовательские правила могут влиять на преобразование между ними.
const percentRule = {
decimalPlaces: 2,
outputFormat: 'number',
rawValueDivisor: 100
};
rawValueDivisor позволяет автоматически масштабировать
значение, например переводить проценты в доли.
Некоторые пользовательские правила регулируют UX поведения поля:
const uxRule = {
caretPositionOnFocus: 'end',
selectNumberOnly: true,
modifyValueOnWheel: true
};
Такие настройки формируют предсказуемое поведение при взаимодействии пользователя с полем ввода.
AutoNumeric позволяет подключать поведение через события, что расширяет модель правил до реактивной логики.
const eventRule = {
onFocus: (event) => {
console.log('focus');
},
onBlur: (event) => {
console.log('blur');
}
};
Эти функции становятся частью пользовательского правила, добавляя поведенческий слой поверх форматирования.
В сложных формах правила часто зависят от других полей. В таких случаях используется программное обновление конфигурации:
const salaryAN = new AutoNumeric('#salary', baseRule);
const bonusAN = new AutoNumeric('#bonus', baseRule);
salaryAN.set({
maximumValue: bonusAN.getNumber() * 10
});
Таким образом формируется зависимое правило, где одно поле влияет на ограничения другого.
Практически все пользовательские правила в AutoNumeric можно разложить на уровни:
Базовый уровень форматирования
Доменный уровень
Интерактивный уровень
Бизнес-уровень
Такое разделение упрощает сопровождение сложных интерфейсов.
В крупных проектах пользовательские правила выносятся в единый реестр:
const rules = {
money: {
decimalCharacter: '.',
digitGroupSeparator: ',',
decimalPlaces: 2
},
strictInt: {
decimalPlaces: 0,
modifyValueOnWheel: false
}
};
Использование:
new AutoNumeric('#input', rules.money);
Это снижает вероятность расхождения форматирования между компонентами системы.
При внедрении AutoNumeric в сложные системы пользовательские правила становятся частью архитектурного слоя:
Такой подход делает AutoNumeric не просто библиотекой форматирования, а инструментом реализации прикладных правил работы с числовыми данными.