PHP正则表达式匹配价格或金额

时间:2010-08-18 23:11:45

标签: php regex

我需要一个符合价格或金额的正则表达式。

它应匹配这些

  • 100
  • 410.00
  • 0.12

但不是这些

  • 100.000
  • -600.00
  • 0.12
  • 0.1234

这适用于所有上述情况,除了单个值,如1

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

如何调整它以使单个整数匹配?任何人都可以解释为什么当前的错误?

5 个答案:

答案 0 :(得分:7)

我建议对Tom Revell的正则表达式进行小的修正,因为你仍然可以输入几个0作为第一个数字。即00002.23,这很可能是不正确的。

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

答案 1 :(得分:4)

使小数部分可选:

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

答案 2 :(得分:2)

您输入的正则表达式将与以下内容匹配:

任何数字,0次或更多次,然后是, 一个点,0或1次,然后是 正好2位数

因此,由于结束位,正则表达式肯定总是需要至少2位数。

我建议如下:

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

哪个匹配1个或更多个数字,可选地后跟一个点,正好是2个数字。

答案 3 :(得分:1)

我认为你最好不要把正则表达式排除在外。

我要做的是将值转换为int并舍入小数,然后检查它是否为负数。我还会检查第一个字符是否是美元符号,如果是,则删除它。代码将以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美分没有前导零时输入“无效金额”。

答案 4 :(得分:0)

制定正则表达式的最佳方法是首先将这个想法写在纸面上。尝试绘制你的正则表达式或用某种伪代码编写它,在脑中测试它并确保它在你的语言的正则表达式语法陷入困境之前是正确的。