Я пытался сделать это раньше, но не смог заставить его работать так полно, как я хотел. Я обнаружил, что захват события «нажатие клавиши» (или, что еще лучше, событие «нажатие клавиши») и перезапись значения поля в нем были действительно хорошими. (Это то, что делают большинство «маскирующих» библиотек, а другие уже опубликовали пример кода.) Здесь я расскажу о ПРОБЛЕМАХ, которые были у меня с этим подходом:
(1) Было трудно справиться с проблемой людей, использующих клавиши курсора для перемещения вперед и назад по полю. Там есть заметки о том, как захватывать клавиши курсора кроссплатформенным способом, но это немного сложно.
(2) Обработка нажатия клавиши удаления была еще более болезненной (тем более что они могут перемещаться или щелкать в любом месте поля). Простое удаление символа перед курсором, когда он нажимает «удалить», НЕ было хорошим опытом для пользователя: бывали ситуации, когда люди не могли удалять вещи! Представьте, что они набирают «123.4», а затем нажимают «Удалить» 6 раз подряд. Первое удаление удаляет «4» (пока что хорошо), следующее удаляет «.». Теперь ваши правила форматирования видят «123», и они добавляются в десятичной форме для «123.» Пользователь может нажать «Удалить» так часто, как ему нравится, и это никуда не денется! Мы решили это, удалив удалить прежний важный символ (цифры в вашем случае) вместо предыдущего символа.
(3) Мы никогда не решали проблему с пастой. Вставка через "ctrl-v" генерирует ключевое событие, которое может быть перехвачено на разных платформах, но вставка через меню редактирования просто не может быть зафиксирована на разных платформах. В конце концов мы просто отказались от этого.
Я надеюсь, что этот опыт поможет. Я хотел бы поделиться своим кодом, но, к сожалению, это было для работы, и мне не разрешено.