Копирование и вставка

Механизмы копирования и вставки в AutoNumeric являются ключевым элементом системы ввода числовых значений, поскольку именно через буфер обмена чаще всего поступают «грязные» данные: числа с лишними символами, пробелами, валютными обозначениями, неверными разделителями и форматами локалей. Библиотека решает задачу нормализации таких данных до внутреннего числового представления и последующего отображения в соответствии с заданной конфигурацией.


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

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

  • Отображаемое значение (formatted value) — включает разделители тысяч, символ валюты, локализованные десятичные разделители.
  • Чистое значение (unformatted value) — число в стандартном формате JavaScript.

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

Ключевые аспекты поведения при копировании:

  • Копируется текущее отображаемое значение input-элемента.
  • Формат сохраняется (например, 1 234,56 € или $1,234.56).
  • Внутреннее значение не изменяется.
  • При выделении части строки копируется только выбранный фрагмент, но он также остаётся отформатированным.

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


Обработка события вставки

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

  • числовые значения в разных локалях (1,234.56, 1.234,56);
  • символы валют (, $, );
  • пробелы и неразрывные пробелы;
  • текстовые примеси (approx. 1000, 1 000 rub);
  • экспоненциальную форму (1e6).

AutoNumeric перехватывает событие paste и выполняет цепочку обработки:

  1. Получение данных из буфера обмена.
  2. Очистка строки от недопустимых символов.
  3. Нормализация разделителей.
  4. Преобразование в число (или промежуточный формат).
  5. Применение правил форматирования.
  6. Обновление значения input.

Нормализация входных данных при вставке

На этапе нормализации выполняется ключевая трансформация строки. Библиотека учитывает настройки экземпляра:

  • decimalCharacter
  • digitGroupSeparator
  • currencySymbol
  • negativeSignCharacter
  • decimalPlaces
  • allowDecimalPadding

Пример поведения:

Вставка строки:

"1 234,56 руб."

При конфигурации:

  • decimalCharacter = ","
  • digitGroupSeparator = " "

Результат:

1234,56

Если локаль не совпадает, AutoNumeric пытается определить наиболее вероятный формат и привести его к внутреннему виду.


Перехват события paste

AutoNumeric использует стратегию перехвата paste для предотвращения вставки «как есть».

Типовой процесс:

  • блокировка стандартного поведения браузера;
  • извлечение текста через clipboard API;
  • передача строки в парсер AutoNumeric;
  • применение set() с уже обработанным значением.

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


Вставка чисел с различными форматами

Европейский формат

Вход:

"1.234,56"

При настройках:

  • decimalCharacter = ","
  • digitGroupSeparator = "."

Результат:

1234,56

Англосаксонский формат

Вход:

"1,234.56"

При тех же настройках:

Результат также нормализуется в:

1234,56

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


Вставка с символами валют и текста

AutoNumeric игнорирует нечисловые символы, если они не являются частью конфигурации.

Примеры очистки:

Вход:

"$ 2,500.00 USD"

Результат:

2500.00

Вход:

"approx. 99.95€"

Результат:

99.95

Если включена строгая настройка, поведение может изменяться:

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

Работа с отрицательными значениями при вставке

AutoNumeric корректно обрабатывает различные формы отрицательных чисел:

  • -1000
  • (1000)
  • - 1 000,50

После вставки:

  • приводится к единому виду -1000.50 (или локальному формату);
  • скобочная нотация преобразуется в стандартный минус при включенной поддержке.

Вставка экспоненциальной записи

Некоторые реализации AutoNumeric поддерживают научную нотацию:

Вход:

"1e6"

Результат:

1000000

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


События и хуки при вставке

AutoNumeric предоставляет набор событий, связанных с изменением значения:

  • onBeforePaste — вызывается перед обработкой вставки;
  • onChange — после изменения значения;
  • onInvalidPaste — при отклонении вставленных данных.

Пример логики обработки:

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

Это позволяет реализовать бизнес-логику, например:

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

Вставка при активном выделении

При вставке в выделенный фрагмент AutoNumeric ведёт себя как стандартное input-поле:

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

Это предотвращает появление «разнородного» форматирования внутри одного значения.


Обработка вставки через программные вызовы

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

  • set(value)
  • setNumeric(value)
  • format(value)

При использовании set() происходит та же логика нормализации, что и при вставке:

  • строка парсится;
  • приводится к числу;
  • форматируется.

Таким образом, вставка и программное присвоение унифицированы.


Ограничения и особенности поведения браузеров

Работа вставки зависит от особенностей окружения:

  • различия в clipboardData между браузерами;
  • ограничения мобильных браузеров;
  • невозможность перехвата некоторых событий в защищённых iframe;
  • особенности IME-ввода (китайский, японский ввод).

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


Вставка больших чисел и потеря точности

При вставке чисел, превышающих безопасный диапазон JavaScript (Number.MAX_SAFE_INTEGER), возможны ограничения:

  • округление;
  • потеря точности;
  • переход в строковое представление (при соответствующих настройках).

AutoNumeric может работать в режиме строкового хранения, чтобы минимизировать эти эффекты.


Контроль вставляемых символов

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

  • допустимые символы (allowedCharacterSet);
  • запрещённые символы;
  • поведение при ошибке (onInvalidPaste);
  • автоматическая очистка (modifyValueOnWheel не относится напрямую, но влияет на поведение значения).

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


Итоговое поведение системы вставки

Механизм копирования и вставки в AutoNumeric представляет собой многоступенчатую систему:

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

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