2014-01-05 4 views
2

мне нужно проверить значение входного сигнала, 0 ~ 99,99, типа с плавающей точкой, и только две цифры после запятой, какValidate формат ввод в поплавке

действительного пример:

0 
1 
.1 
.12 
12.12 

недопустимого пример:

(empty) 
100 
123.1 
.123 
12.123 

Так я создаю это регулярное выражение

var isValid = new RegExp(/^\d{1,2}(\.\d{0,2})?$/).test(parseFloat($('#myText').val())); 

любой другой способ проверить? сделать код проще и проще.

+0

Что относительно 023.1? Должен ли он считаться действительным? Было бы разумно признать начальные нули. – user2314737

+0

Да, предложение ur обязательно. Я думаю, 023 означает 23! – Kevin

ответ

2

Вы можете попробовать использовать регулярное выражение:

^\d{1,2}(?:\.\d{1,2})?$|^\.\d{1,2}$ 

regex101 demo

Регулярное выражение состоит из двух частей:

^\d{1,2}(?:\.\d{1,2})?$ Это будет принимать номера с 2-х цифр, был возможным десятичные до двух десятичные цифры.

^ соответствует началу линии,

\d{1,2} совпадает с любым количеством по меньшей мере, один раз и не более 2-х раз.

(?: ...) не является захват группы (это делает регулярное выражение немного более эффективным, не имея, чтобы сохранить захваченное группу)

? вблизи конца показывает 0 или 1 раз,

$ указывают на конец (таким образом, больше нет номеров).

Вторая часть ^\.\d{1,2}$ принимает знаковые числа, в которых первая цифра может отсутствовать, как таковой, .1 будет проходить.

Первая и вторая часть связана с | (или оператор), который означает, что если совпадение не для первой части, двигатель попытается со второй частью, прежде не называя его нет матча

+0

кажется более сложным. но, возможно, более надежным. хороший сайт кстати. – Kevin

+0

@Kevin Спасибо. Это не сложнее первого ответа, вы заметите, что их регулярное выражение изменилось так, как мое;) – Jerry

+0

Да, сначала я посмотрел на регулярное выражение Кевина и подумал, что это правильно, поэтому мой ответ был сфокусирован на других вещах, но его комментарий (под моим ответом) побудило меня взглянуть немного ближе. +1 для правильного правильного выражения. – nnnnnn

2

«сделать код проще и проще».

OK. Здесь вы идете:

var isValid = /^\d{1,2}(\.\d{0,2})?$|^\.\d\d?$/.test($('#myText').val()); 

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

Ваше регулярное выражение не принимает . в качестве первого символа.

И если вы передаете результат от parseFloat() до .test(), вы не проверяете, что вводил пользователь, потому что parseFloat() игнорирует ведущие пробелы и конечные нецифровые данные. Таким образом, ваш код будет принимать, например, " 12abc" как действительный. Если вы действительно хотите игнорировать ведущие или конечные пробелы, вы можете удовлетворить это в своем регулярном выражении.

+0

звучит хорошо. Я чувствую себя лучше. как насчет внутреннего скрипта регулярного выражения? – Kevin

+0

Я что-то упустил? С каких это пор мы начали определять типы данных наших переменных в JavaScript? –

+0

Thanks @MicahHenning - Очевидно, я просто скопировал это из вопроса, не задумываясь об этом. Исправлена. – nnnnnn

0

Здесь является регулярное выражение, которое также принимает начальные и конечные нули: http://regex101.com/r/hV1uD8

/^(?:0*\d{1,2})(?:\.\d{0,2}0*)?$|^(?:0*\.)(?:\d{1,2}0*)$/ 

Допустимые примеры:

0 
1 
.1 
.12 
12.12 
23.1 
023.1 
12.1200 
012.120 
1. 
1.010 

Invalid:

100 
123.1 
.123 
12.123 
12.1201 

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

var isValid = /^\d{1,2}(?:\.\d{1,2})?$|^\.\d{1,2}$/.test(parseFloat($('#myText').val())); 

, но это будет менее эффективным, потому что вы бы проанализируйте одно и то же выражение дважды.

+0

Я думаю, что использование parseFloat может сделать код тривиальным. но когда я parseFloat ('023'), я получил '19'. это не то, что я хочу! – Kevin

+0

Так что, возможно, мне нужно обрезать ('0') перед повторным тестированием. – Kevin

Смежные вопросы