2010-08-18 100 views
3

我需要一个正则表达式将匹配在价格或数量。PHP正则表达式匹配的价格或金额

应该匹配这些

  • 410.00
  • 0.12

但这些

  • 100.000
  • -600.00
  • 0.12
  • 0.1234

这适用于所有上述情况除了像1

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

我怎么能调整,使单一的整数将匹配单个值?任何人都可以解释为什么目前的错误?

回答

7

我提出一个小的修正,以汤姆·雷维尔的正则表达式,因为你仍然可以输入几个0的为第一个数字。即00002.23,这很可能是不正确的。

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

你是对的。接得好! – hitfactory 2010-08-18 23:42:23

+0

这工作好我。谢谢 :) – Chinmay235 2017-01-12 12:07:16

4

使小数部分可选:

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

刚刚意识到你先回答。谢谢! – hitfactory 2010-08-18 23:27:45

2

您所输入的正则表达式将匹配如下:

的任何数字,0次以上,其次, 点,或0 1次,其次是 正好2位数

因此正则表达式肯定会一直要求因年底位至少2位。

我建议如下:

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

将匹配1个或多个数字,可选地后跟一个圆点,正好两个数字。

+0

完美。谢谢,汤姆! – hitfactory 2010-08-18 23:26:27

+0

@kidrobot:你应该接受汤姆的解决方案,因为它为你工作 – cam 2010-08-18 23:29:17

1

我想你最好马上去正规表达式出来混的。

我会做的是价值转换为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美分,没有前导零。

+0

另一个功能是预计数量是在商店或价格标签中显示的种类,因此12.34512或.1是不允许的。但是,是的,我有时想知道正则表达式的效率。 – hitfactory 2010-08-18 23:30:14

+0

是的,但我发布的代码应该照顾到,我想。 12.34512会变成12.34,并且.2应该变成0.2(当转换回字符串时,可能不是隐含的,但并不难),尽管我可能弄错了。您可以添加更多以确保有一个尾随零,IMO的努力是值得的,以避免混淆用户。但无论如何,它看起来像你已经有了一个解决方案 - 我会留在这里以防别人帮助其他人 – 2010-08-19 00:39:02

0

计算正则表达式的最佳方法是先在纸上写下主意。尝试绘制您的正则表达式或将它写入某种伪代码中,在您的头脑中进行测试并确保它正好在您陷入语言的正则表达式语法之前。