Регулярное выражение PHP для соответствия цене или количеству

Мне нужно регулярное выражение, которое будет соответствовать цене или сумме.

Он должен соответствовать этим

  • 100
  • 410,00
  • 0,12

но не эти

  • 100,000
  • -600,00
  • +0,12
  • 0,1234

Это работает для всех вышеперечисленных случаев, за исключением одиночных значений, таких как 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 вашего языка.