Отрицательные числа

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

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

Inputmask({
  alias: "numeric",
  allowMinus: true
}).mask(input);

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

Ключевой момент заключается в том, что минус не рассматривается как обычный символ. Он отделяется от числового ядра и обрабатывается на уровне нормализации значения.

Поведение курсора и ввод знака отрицания

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

При вводе внутри строки поведение может корректироваться автоматически:

  • вставка минуса в середине числа часто приводит к его перемещению в допустимую позицию;
  • повторный ввод минуса игнорируется или приводит к переключению состояния знака;
  • при удалении числовой части знак может сохраняться как отдельный элемент состояния.

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

Нормализация отрицательных значений

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

  • знак минуса отделён от числовой части;
  • ведущие нули устраняются или стандартизируются;
  • дробная часть синхронизируется с разделителем.
Inputmask({
  alias: "numeric",
  allowMinus: true,
  digits: 2,
  radixPoint: "."
}).mask(input);

При такой настройке значение вида -00012.30 преобразуется в структурированное представление -12.30, даже если пользователь вводил данные в несокращённой форме.

Ограничение диапазона отрицательных чисел

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

Inputmask({
  alias: "numeric",
  allowMinus: true,
  min: -100,
  max: 100
}).mask(input);

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

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

Работа с нулевым значением и отрицательным нулём

Отдельное внимание уделяется состояниям, связанным с нулём. При использовании отрицательных чисел возможно появление промежуточного состояния -0, которое возникает в процессе редактирования.

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

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

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

Взаимодействие с дробной частью

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

Inputmask({
  alias: "numeric",
  allowMinus: true,
  digits: 3,
  radixPoint: ","
}).mask(input);

Ввод -12,345 интерпретируется как единое значение, где:

  • - задаёт знак числа;
  • 12 формирует целую часть;
  • 345 формирует дробную часть.

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

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

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

Примеры обработанных вставок:

  • "-45.6" → корректное отрицательное число;
  • "45.6-" → нормализация к -45.6 или 45.6 в зависимости от политики;
  • "--45" → устранение дублирующих символов и преобразование к -45.

Алгоритм очистки ориентируется на первую валидную интерпретацию знака и игнорирует избыточные символы.

Кастомизация поведения знака минус

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

  • допустимость знака в любой позиции;
  • поведение при повторном вводе;
  • реакцию на удаление числовой части;
  • стратегию нормализации.

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

Особенности взаимодействия с автоформатированием

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

Это приводит к стабильному визуальному представлению:

  • -1000000-1 000 000
  • -1234.56-1 234.56

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

Состояния ввода и промежуточные значения

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

  • - как самостоятельное значение;
  • -0 как промежуточная форма;
  • -1. как этап ввода дробной части.

Эти состояния сохраняются до тех пор, пока ввод не будет завершён или преобразован в валидное число.

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