Мне нужно регулярное выражение, которое будет соответствовать цене или сумме.
Он должен соответствовать этим
но не эти
Это работает для всех вышеперечисленных случаев, за исключением одиночных значений, таких как 1
/^[0-9]*\.?[0-9]{2}+$/
Как я могу настроить его, чтобы совпадали целые числа? И может ли кто-нибудь объяснить, почему текущий является неправильным?
Я предлагаю небольшую поправку к регулярному выражению Тома Ревелла, поскольку вы все равно можете ввести несколько 0 в качестве первых цифр. т.е. 00002.23, что, скорее всего, неверно.
/^([1-9][0-9]*|0)(\.[0-9]{2})?$/
Сделайте дробную часть опциональной:
/^[0-9]+(\.[0-9]{2})?$/
Регулярное выражение, которое вы ввели, будет соответствовать следующему:
Любая цифра, 0 или более раз, за которой следует точка, 0 или 1 раз, за которой следует ровно 2 цифры
Таким образом, регулярное выражение всегда будет требовать, по крайней мере, двух цифр из-за конечного бита.
Я бы предложил следующее:
/^[0-9]+(\.[0-9]{2})?$/
Который будет соответствовать 1 или более цифрам, необязательно, затем точка и ровно 2 цифры.
Я думаю, вам лучше оставить регулярные выражения из состава.
То, что я сделал бы, это преобразовать значение в int и округлить десятичное число, а затем проверить, является ли оно отрицательным. Я также хотел бы проверить, является ли первый символ значком доллара, и если да, просто удалите его. Код был бы более простым и понятным для ИМО, и если бы кто-то действительно входил в 12.34512 или .1, система все равно работала бы.
//untested $amount = "$0.12" if( $amount && $amount[0] == '$' ) { ltrim($amount, '$'); } $int_amount = (int) $amount; $int_amount = round($int_amount, 2); if( $amount <= 0 ) { //error }
При этом я не знаю, нужно ли использовать регулярное выражение по какой-либо причине (например, если у вас есть функция проверки, которая принимает значение и регулярное выражение в качестве аргументов), но в таком случае я думаю, что я свободен в ценовом формате было бы лучше, чтобы не сообщать пользователям, что они ввели «недопустимую сумму», когда они вводят 12 центов без начального нуля.
Лучший способ выработать регулярное выражение – это начать, получив идею на бумаге. Попробуйте рисовать регулярное выражение или записывать его в каком-то псевдокоде, проверить его в своей голове и убедиться, что это правильно, прежде чем вы увязнете в синтаксисе regex вашего языка.