maximumValue

Назначение ограничения верхнего порога значения

maximumValue задаёт верхнюю границу допустимого числового значения, которое может быть введено или установлено в поле ввода. Любое значение, превышающее этот предел, либо корректируется автоматически (в зависимости от конфигурации), либо блокируется на этапе ввода.

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

Формат и тип значения

maximumValue принимает строковое представление числа:

  • "1000"
  • "999999.99"
  • "-1" (в комбинации с логикой отрицательных диапазонов)
  • "0" (для запрета положительных значений)

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


Поведение при превышении максимального значения

Поведение при выходе за пределы maximumValue зависит от дополнительных параметров конфигурации:

1. Автоматическое ограничение (clamping)

При включённой нормализации значение принудительно приводится к максимуму:

new AutoNumeric(input, {
    maximumValue: "1000"
});

Ввод:

1500 → 1000

Значение не сохраняется выше установленного порога.


2. Блокировка ввода

В некоторых режимах библиотека предотвращает ввод символов, которые приведут к превышению:

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

Это особенно важно для UX в финансовых интерфейсах, где недопустимо временное состояние «невалидного числа».


3. Отложенная валидация

При некоторых конфигурациях ограничение применяется только при потере фокуса:

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

Взаимодействие с minimumValue

maximumValue всегда работает в связке с minimumValue, формируя диапазон:

minimumValue ≤ value ≤ maximumValue

Пример:

new AutoNumeric(input, {
    minimumValue: "0",
    maximumValue: "100"
});

Поведение:

Ввод Результат
-10 0
50 50
150 100

При нарушении границ применяется либо обрезка, либо запрет ввода, в зависимости от режима.


Приоритет ограничения над форматированием

maximumValue имеет более высокий приоритет, чем:

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

Это означает, что даже если формат допускает более точное значение, оно всё равно будет приведено к допустимому диапазону.

Пример:

new AutoNumeric(input, {
    maximumValue: "10",
    decimalPlaces: 4
});

Ввод:

10.99999 → 10.0000

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

При использовании API:

an.set(5000);

если установлено:

maximumValue: "1000"

результат зависит от стратегии обработки:

  • значение либо автоматически корректируется до 1000
  • либо установка игнорируется
  • либо выбрасывается предупреждение (в зависимости от режима strict/loose)

Особенности работы с отрицательными диапазонами

maximumValue может быть отрицательным числом:

{
    minimumValue: "-1000",
    maximumValue: "-10"
}

В таком случае диапазон работает «в обратную сторону»:

Ввод Результат
-5 -10
-500 -500
-2000 -1000

Важно учитывать, что логика сравнения остаётся математической, а не строковой.


Влияние на пользовательский ввод

maximumValue влияет на поведение клавиатурного ввода:

  • предотвращает ввод лишних цифр при достижении лимита
  • блокирует вставку (paste), если значение выходит за предел
  • корректирует значение при ручной модификации
  • управляет поведением стрелок вверх/вниз (step increment)

Работа с десятичными значениями

При наличии дробной части учитываются:

  • decimalCharacter
  • decimalPlaces
  • режим округления

Пример:

{
    maximumValue: "99.99",
    decimalPlaces: 2
}

Ввод:

100.00 → 99.99

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


Взаимодействие с unformatOnSubmit

При отправке формы значение может быть преобразовано:

  • если включено unformatOnSubmit: true, перед отправкой используется сырое число
  • если оно выходит за пределы maximumValue, оно уже гарантированно нормализовано

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


Особенности при работе с динамическим изменением опций

maximumValue можно изменять после инициализации:

an.update({
    maximumValue: "500"
});

Поведение при обновлении:

  • текущее значение пересчитывается
  • при необходимости автоматически приводится к новому максимуму
  • курсор и формат сохраняются

Если новый максимум ниже текущего значения, происходит немедленная нормализация.


Совместимость с научной и финансовой точностью

В высокоточных сценариях:

  • maximumValue должен задаваться с учётом погрешностей округления
  • рекомендуется оставлять запас (epsilon margin)
  • особенно важно при работе с валютами и процентами

Пример проблемного сценария:

maximumValue: "100"
ввод: 99.999999

После округления может произойти переход в 100 или обратно в 99.99 в зависимости от конфигурации округления.


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

1. Использование числа вместо строки

maximumValue: 1000 // нежелательно

Правильно:

maximumValue: "1000"

2. Несогласованность с minimumValue

minimumValue: "500"
maximumValue: "100"

Результат: некорректный диапазон, приводящий к конфликтам валидации.


3. Игнорирование округления

Если decimalPlaces больше, чем ожидается, значение может временно «вылезать» за предел до коррекции.


Роль maximumValue в архитектуре контроля данных

Внутри AutoNumeric параметр maximumValue является частью трёхуровневой системы:

  1. Парсинг ввода — преобразование строки в число
  2. Валидация диапазона — проверка minimumValue / maximumValue
  3. Форматирование вывода — применение локали и округления

maximumValue действует на втором этапе, но может инициировать корректировки на первом и третьем.


Поведение при локализациях и разделителях

При разных локалях:

  • 1,000.50 (US)
  • 1.000,50 (EU)

maximumValue сравнивается не с текстом, а с нормализованным числом, поэтому локаль влияет только на отображение, но не на логику ограничения.


Итоговая логика обработки значения

При каждом изменении выполняется цепочка:

  1. Пользователь вводит значение
  2. Строка нормализуется в число
  3. Проверяется maximumValue
  4. При нарушении — корректировка или блокировка
  5. Значение форматируется обратно
  6. Отображается в input

Эта цепочка делает maximumValue ключевым элементом защиты данных на уровне UI.