Запрещенные символы

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

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


Базовая семантика допустимого набора символов

Числовое поле AutoNumeric допускает строго ограниченный набор символов:

  • цифры 0–9
  • символ десятичного разделителя (например, . или ,)
  • символ группировки разрядов (например, пробел или ,)
  • знак отрицательного числа -
  • опционально — пробельные символы, если они интерпретируются как разделители групп

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


Категории запрещённых символов

Алфавитные символы

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

  • A–Z, a–z
  • А–Я, а–я
  • любые комбинированные буквенно-цифровые последовательности

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


Символы валют и обозначений

Любые валютные символы не входят в допустимый набор:

  • $, , , ¥, £
  • локальные или кастомные обозначения валют

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


Несанкционированные знаки пунктуации

Следующие символы считаются недопустимыми в числовом поле:

  • двоеточие :
  • точка с запятой ;
  • слеши / и \
  • скобки ()[]{}
  • кавычки " и '
  • символы @ # % & * _ = + ! ?

Их наличие приводит к очистке строки либо к обрезке значения до допустимой числовой части.


Множественные десятичные разделители

Особый случай — повторяющиеся символы десятичной точки или запятой:

  • 12.34.56
  • 12,,34
  • 1.2.3.4

Даже если символ соответствует decimalCharacter, повторное использование считается ошибочным. Алгоритм оставляет только первый корректный разделитель, остальные удаляются.


Некорректный знак минуса

Знак отрицательного числа имеет строгие ограничения:

  • допускается только в начале значения (или согласно конфигурации)
  • повторное использование --12 запрещено
  • расположение внутри числа 12-34 считается недопустимым

Также учитываются альтернативные Unicode-символы минуса, которые приводятся к стандартному - или отбрасываются.


Пробельные символы и разделители

Пробелы могут трактоваться двояко:

  • как допустимые групповые разделители (например, 1 000 000)
  • как мусорные символы при неправильной локали

Неразрывные пробелы (\u00A0) и тонкие пробелы (\u2009) также нормализуются. При несоответствии конфигурации они удаляются.


Обработка Unicode-аномалий

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

  • full-width цифры 123
  • альтернативные знаки минуса (Unicode U+2212)
  • математические символы вместо обычных операторов
  • комбинированные диакритические формы

Такие символы нормализуются через этап преобразования в базовую ASCII-форму. При невозможности нормализации символ исключается.


Поведение при вставке (paste sanitization)

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

  1. извлечение текстового содержимого
  2. удаление всех символов, не входящих в допустимый набор
  3. приведение альтернативных символов к стандартным
  4. применение правил десятичного разделителя
  5. финальная валидация результата

Пример:

  • вход: € 1.234,56 abc
  • результат: 1234.56 (в зависимости от локали)

Поведение при вводе с клавиатуры

Каждый символ обрабатывается в реальном времени:

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

Ключевым механизмом является предотвращение попадания недопустимых символов в raw-значение, а не их постфактум удаление.


Режимы строгой и мягкой фильтрации

AutoNumeric допускает различные стратегии обработки запрещённых символов:

Строгий режим

Любой недопустимый символ блокируется на этапе ввода. Значение не изменяется.

Мягкий режим

Символ принимается, но удаляется при нормализации. Визуально ввод может кратковременно отображать некорректные данные до перерасчёта.


Влияние конфигурации на допустимые символы

Набор запрещённых символов напрямую зависит от параметров:

  • decimalCharacter — определяет допустимый десятичный разделитель
  • digitGroupSeparator — влияет на допустимые групповые символы
  • allowDecimalPadding — влияет на обработку хвостовых нулей
  • negativePositiveSignPlacement — задаёт допустимое расположение знака
  • currencySymbol — если включён, влияет только на отображение, не на ввод

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


Кастомные правила фильтрации

В расширенных сценариях применяется пользовательская логика:

  • перехват ввода через события
  • ручная валидация строки до присвоения значения
  • постобработка через форматирование raw-значения

Это позволяет вводить дополнительные ограничения, например:

  • запрет определённых диапазонов символов
  • блокировка любых не-ASCII значений
  • ограничение на использование пробелов

Ошибочные комбинации символов

Некоторые сочетания автоматически признаются некорректными:

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

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


Итоговая модель очистки

Обработка запрещённых символов строится как конвейер:

  1. нормализация Unicode
  2. фильтрация по допустимому набору символов
  3. обработка локальных правил разделителей
  4. устранение дубликатов специальных символов
  5. валидация итогового числового значения
  6. синхронизация formatted и raw значения

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