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

3

我需要一个正则表达式来匹配价格或金额。

它应该匹配以下内容

  • 100
  • 410.00
  • 0.12

但不应匹配以下内容

  • 100.000
  • -600.00
  • .12
  • .1234

这个正则表达式对于上述所有情况都有效,但是对于单个值(例如1)无效。

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

我该如何调整它,以便单个整数匹配?有人能解释为什么当前的是错误的吗?
5个回答

7

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

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

如何禁止输入0.00和0? - Vit

5
使小数部分变为可选:
/^[0-9]+(\.[0-9]{2})?$/

刚刚意识到你已经先回答了。谢谢! - hitfactory
此外,这适用于大多数情况 /^\d+(\.\d{2})?$/ - Md. A. Apu

2
您输入的正则表达式将匹配以下内容:
任何数字,0次或多次,后跟0次或1次的小数点,然后是恰好2个数字。
因此,由于结尾部分,正则表达式肯定需要至少2个数字。
我建议使用以下正则表达式:
/^[0-9]+(\.[0-9]{2})?$/
它将匹配1个或多个数字,后面可以选择跟着一个点和恰好2个数字。

@kidrobot:你应该接受Tom的解决方案,因为它对你起作用了。 - cam

1

我认为最好不要将正则表达式混合在其中。

我的做法是将值转换为整数并四舍五入,然后检查它是否为负数。我还会检查第一个字符是否为美元符号,如果是,就将其删除。这样的代码更简单、更易读,在我看来更好。如果有人输入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美分时。

另一个函数在后续的代码中期望传入的金额是类似商店或价格标签上显示的形式,因此不允许使用12.34512或.1这样的格式。但是,我确实有时会对正则表达式的效率产生疑问。 - hitfactory
是的,但我发布的代码应该会处理这个问题。12.34512将变成12.34,而.2应该会变成0.2(当转换回字符串时。也许不是隐式的,但这并不难),虽然我可能错了。你可以添加更多内容以确保有一个尾随零,我认为这样做的努力是值得的,以避免混淆用户。但无论如何,看起来你已经有了一个解决方案——我只是在这里留下它,以防它能帮助其他人。 - Carson Myers

0

学习正则表达式的最佳方法是先在纸上把想法写下来。尝试画出你的正则表达式或者用某种伪代码编写它,在脑海中测试并确保正确性,然后再深入研究语言的正则表达式语法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接