Регулярное выражение поля цены без префикса 0 за центы - PullRequest
1 голос
/ 09 августа 2011

Я использую следующее регулярное выражение для проверки поля цены:

(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2})?$

Это работает абсолютно идеально, за исключением случаев, когда пользователь вводит цену в форме .60 и т. Д. Если я добавлю0 впереди, как 0,60, кажется, работает нормально, но я бы хотел, чтобы пользователь пропустил 0 в качестве префикса.

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

Использовать этот синтаксис для (необязательная_подгруппа)? , т. Е. Вкладывать в другую пару скобок '(...)' и добавлять '?'

В вашем случае целая целая часть (\d{1,3}(\,\d{3})*|(\d+)) является необязательной. Следовательно

((\d{1,3}(\,\d{3})*)|(\d+))?(\.\d{2})?$

Однако теперь это будет соответствовать абсолютно пустым выражениям, то есть 0 целых и 0 десятичных цифр. Поэтому нам необходимо либо хотя бы 1 целое число (+ необязательная десятичная часть) ...

((\d{1,3}(\,\d{3})*)|(\d+))(\.\d{2})?

или не менее 2 десятичных цифр (+ необязательная целочисленная часть)) ...

((\d{1,3}(\,\d{3})*)?|(\d+))(\.\d{2})

Так что сопоставьте любой из этих двух (INTEGER)(DECIMAL)?|(INTEGER)?(DECIMAL) - мы могли бы сжать ваше регулярное выражение, если вы сообщите нам больше.

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

Не соответствует десятичной запятой само по себе. Вам решать, допустите ли вы одну десятичную цифру: .1

1 голос
/ 09 августа 2011
(\d{1,3}(\,\d{3})*|(\d*))(\.\d{2})?$
...