2017-01-16 7 views
3

Мне нужно проверить целые числа с рисунком ниже. Целочисленная часть может содержать до 5 символов, а значение фракции может содержать до 2 символов. (значение фракции необязательно). Leading + или - также является необязательным.Regex для проверки десятичных знаков

(+/-) mmmmm (5).nn (2) 

Тестовые данные

Valid 
-1 
+1 
1 
+.1 
-.1 
.1 
+11111.11 
-11111.11 
11111 

Invalid 
+111111.11 
-111111.11 
+11111.111 
-11111.111 
11111.111 
111111.11 
+1. 
-1. 
1. 

Это то, что я в настоящее время используют

[+-]?\d{0,5}\.?\d{1,2}? 

Является ли это правильно? Мне что-то не хватает?

Вот test case.

EDIT

Если есть дополнительное ограничение, чтобы количество цифр от шкалы включается в точности.

Например, DECIMAL (5, 2) определяет числа формы 1234.5, тогда как DECIMAL (5, 5) определяет числа формы 1.2345. Как мне это изменить?

ответ

3

д:

^[+-]?(?:[0-9]{1,5})?(?:\.[0-9]{1,2})?$ 
  • ^[+-]? матчи + или - при запуске, по желанию
  • (?:[0-9]{1,5})? соответствует одной до пяти цифр, факультативных
  • (?:\.[0-9]{1,2})?$ соответствует символу точки, за которой следует одна или две цифр в конце, необязательно. Как буквальный . находится внутри, не захваченная группы с цифрами шаблона следующим, он будет соответствовать только тогда, когда требуются цифры после

Demo

2

В JavaScript можно проверить номер с помощью

Number(n) === Number(n) 

Для любых не-числовых значений n, как "ABC" или [1, 2, 3], Number(n) возвратит NaN. Учитывая, что NaN !== NaN в любом случае, вы можете легко определить, является ли число n.

Номер конструктор отлично работает почти с любой формой представления чисел:

Number(123) // -> 123 
Number('123') // -> 123 
Number('+12e+3') // -> 12000 
Number('-1.2e-3') // -> -0.0012 
Number('--123') // -> NaN 

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

  1. Дополнительно " + "или" - ".
  2. От 0 до 5 цифр.
  3. Дополнительно "." а затем от 1 до 2 цифр в десятичной части.Вся часть является необязательной, что означает, что одна точка без цифр недействительна

И не экспоненциальная форма.

Это было бы

/^[+-]?\d{0,5}(\.\d{1,2})?$/ 

так что

/^[+-]?\d{0,5}(\.\d{1,2})?$/.test(123) // -> true 
/^[+-]?\d{0,5}(\.\d{1,2})?$/.test('123') // -> true 
/^[+-]?\d{0,5}(\.\d{1,2})?$/.test('+123.45') // -> true 
/^[+-]?\d{0,5}(\.\d{1,2})?$/.test('--123') // -> false 
/^[+-]?\d{0,5}(\.\d{1,2})?$/.test('-123.456') // -> false 

Пожалуйста, обратите внимание, что часть (\.\d{1,2})? цела необязательными. В вашем случае либо точечные, либо две десятичные цифры являются необязательными, поэтому «123.» будет действительным числом. В Javascript это действительно так, поэтому не должно быть никаких проблем с этим.

1

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

^[+-]?[0-9]{0,5}?(\.[0-9]{1,2})?$

или

^[+-]?\d{0,5}?(\.\d{1,2})?$

Demo1

Demo2