Ограничить ввод до 5 символов, если целое число или 8 символов с дробью

У меня есть простой ввод текста:

 <div style="float:right" class="xField">
      <input id="userLength" name="userLength"/>
      <label style="margin-left: 3px;">m</label>
 </div>

Мне нужно, чтобы этот ввод принимал только числа, и если число является целым числом, оно должно разрешать только 5 символов, т.е. 12345. Если число включает дробь, оно должно допускать 8 символов, то есть 12345,99.

Я пытался добавить maxlength к входным данным, но это работает только с одним из этих условий за раз.

Как я могу это сделать?


person Henrique Tavares    schedule 12.12.2019    source источник
comment
Отвечает ли это на ваш вопрос? Принудительный ввод числа с двумя десятичными знаками и ТОЛЬКО два   -  person Heretic Monkey    schedule 13.12.2019


Ответы (2)


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

например (это не запрещает ввод неверных данных, но помечает поле как недействительное, если шаблон не соответствует).

<div style="float:right" class="xField">
      <input id="userLength" name="userLength" pattern="\d{1,5}(,\d{1,2})?" />
      <label style="margin-left: 3px;">m</label>
 </div>

person Gabriele Petrioli    schedule 12.12.2019
comment
Это позволяет пользователю вводить все, что он хочет, и помечает ввод как недействительный, если значение не соответствует шаблону. - person Heretic Monkey; 12.12.2019
comment
@HereticMonkey, это рекомендация. Что делать, если пользователь вставляет из документа и хочет отредактировать его перед отправкой? вообще грубо запрещать вставку. Лучше всего оставить проверку, когда пользователь явно отправляет - person santiago arizti; 13.12.2019
comment
@santiagoarizti Конечно, и если бы в ответе было такое предостережение, я бы не добавил свой комментарий. Как бы то ни было, ответ представлен как ответ на вопрос, как запретить пользователю вводить более пяти цифр и двух знаков после запятой. - person Heretic Monkey; 13.12.2019

Все, что вам нужно, это:

<form action="/" id="form">
    <input pattern="\d{0,5}([,.]\d{1,2})?" title="max 5 digits and 2 decimals">
    <button type="submit">submit</button>
</form>

Это позволит пользователю ввести столько символов, сколько он пожелает, но при проверке формы форма не будет работать, если шаблон не будет удовлетворен.

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

Кроме того, если ввод не должен быть пустым, вы можете добавить атрибут required, подобный этому

<input ... pattern="" required>

Это также вызывает сбой проверки, если ввод пуст.

Если шаблон не соблюдается, браузер покажет пользователю все, что находится внутри title="".

Поэкспериментируйте с этой скриптой, чтобы увидеть, как отображаются ошибки проверки: https://jsfiddle.net/aqohfsrj /2/

Кроме того, если вы хотите что-то сделать с входным значением с помощью javascript, я рекомендую привязываться к событию submit формы, а не к событиям нажатия кнопки или ввода ввода-keydown.

document.getElementById("form").addEventListener("submit", e => {
    // if this code is executed it means the validation passed, otherwise errors
    // are displayed to the user and this code is not run.
    e.preventDefault(); // <-- to avoid trying to use the form's action i.e. the browser will not navigate.
});

Чтобы понять регулярное выражение, которое я использовал, вы можете увидеть этот файл regex101: https://regex101.com/r/aHLI6u /1

Наконец, рекомендация: старайтесь избегать maxlength для проверки; часто мне приходилось заполнять онлайн-форму, которая запрашивает, например, кредитную карту, и она ограничена maxlength="16", что на первый взгляд звучит как хорошая идея, но что, если вы попытаетесь скопировать свою кредитную карту из заметки, которая у вас есть? или что-то в этом роде, и оно хранилось как 5430-0000-1111-2222 (с тире). Кажется грубым запрещать вставлять больше символов, чем разрешено, когда все, что хотел пользователь, это вставить, затем отредактировать, а затем отправить. Я бы позволил пользователю добавлять столько контента, сколько он хочет, чтобы он мог редактировать на месте, чтобы удалить круглые скобки (для телефонов), удалить знаки валюты (для денег), удалить тире (для кредитных карт) и проверить after< /strong> они отправили форму.

person santiago arizti    schedule 12.12.2019
comment
если вы чувствуете себя перегруженным регулярными выражениями (регулярными выражениями), вы можете найти в Google почти все типы регулярных выражений, которыми люди делились и совершенствовали сверхурочно. Например, для проверки адреса электронной почты или валюты лучше всего использовать регулярное выражение, проверенное другими. Мое регулярное выражение было написано мной только что, и я не знаю, удовлетворяет ли оно всем вашим потребностям. - person santiago arizti; 13.12.2019