PHP регулярное выражение, чтобы соответствовать цене или сумме - PullRequest
3 голосов
/ 19 августа 2010

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

Должно совпадать на этих

  • 100
  • 410,00
  • 0,12

, но не на этих

  • 100.000
  • -600,00
  • .12
  • .1234

Это работает для всех вышеперечисленных случаев, кромеотдельные значения, такие как 1

/^[0-9]*\.?[0-9]{2}+$/

Как я могу настроить его так, чтобы одинаковые целые числа соответствовали?И кто-нибудь может объяснить, почему текущий не так?

Ответы [ 5 ]

7 голосов
/ 19 августа 2010

Я предлагаю небольшую поправку к регулярному выражению Тома Ревелла, поскольку вы все равно можете ввести несколько нулей в качестве первых цифр.т.е. 00002.23, что, скорее всего, неверно.

/^([1-9][0-9]*|0)(\.[0-9]{2})?$/
4 голосов
/ 19 августа 2010

Сделать дробную часть необязательной:

/^[0-9]+(\.[0-9]{2})?$/
2 голосов
/ 19 августа 2010

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

Любая цифра, 0 или более раз, затем точка, 0 или 1, а затем ровно 2 цифры

Таким образом, регулярное выражение всегда будет требовать как минимум 2 цифры из-за конечного бита.

Я бы предложил следующее:

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

Который будет соответствовать 1 или более цифрам, за которыми может следовать точка и ровно 2 цифры.

1 голос
/ 19 августа 2010

Я думаю, вам лучше оставить регулярные выражения вне смеси.

Что я хотел бы сделать, это преобразовать значение в целое число и округлить десятичную дробь, а затем проверить, не отрицательно ли это. Я также проверил бы, является ли первый символ знаком доллара, и если это так, просто удалите его. Код был бы проще и более читабельным, чем IMO, и если кто-то введет 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
}

При этом я не знаю, есть ли у вас для использования regexp по какой-либо причине (например, если у вас есть функция проверки, которая принимает значение и regexp в качестве аргументов), но в случае, подобном Я думаю, что лучше быть либеральным в ценовом формате, чтобы не говорить пользователям, что они вводят «недействительную сумму», когда вводят 12 центов без начального нуля.

0 голосов
/ 19 августа 2010

Лучший способ отработать регулярное выражение - начать с написания идеи на бумаге.Попробуйте нарисовать свое регулярное выражение или написать его в каком-то псевдокоде, протестируйте его в своей голове и убедитесь, что оно правильно, прежде чем увязнуть в синтаксисе регулярного выражения вашего языка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...