【问题标题】:PHP Currency Regular ExpressionPHP 货币正则表达式
【发布时间】:2025-12-02 19:15:01
【问题描述】:

我正在尝试找到一段正则表达式来匹配货币值。

我只想匹配数字和 1 个小数点,即

允许

  • 10
  • 100
  • 100.00

不允许

  • 字母字符
  • 100,00
  • +/- 100

我已经搜索并尝试了很多,但没有任何运气。

希望大家多多指教

【问题讨论】:

标签: php regex format numbers


【解决方案1】:
if (preg_match('/^[0-9]+(?:\.[0-9]+)?$/', $subject))
{
    # Successful match
}
else
{
    # Match attempt failed
}

旁注:如果你想限制你想要的小数位数,你可以这样做:

/^[0-9]+(?:\.[0-9]{1,3})?$/im

所以

100.000

会匹配,而

100.0001

不会。

如果您需要任何进一步的帮助,请发表评论。

PS 如果可以,请使用上面发布的数字格式化程序。原生函数总是更好(更快),否则这个解决方案会很好地为您服务。

【讨论】:

  • 感谢您提请我注意。固定。
  • 投反对票有什么理由吗?如果您看到真正的问题,我很乐意调整答案。然而,什么都不说就拒绝投票只是愚蠢的,尤其是当它是公认的答案时。
  • 这仍将匹配 000000.10.123。除了前导零之外,我不认为 Lee 想要小数点后的可变位数。
  • @ThePixelDeveloper:为什么要添加i(不区分大小写)和m(多行)标志?这些不是没用吗?您只查找不区分大小写的数字,您只查找一行。
  • 完全正确@MarcoDemaio。最初的帖子是 4 年前创建的,我想我当时是盲目地做事的。谢谢。
【解决方案2】:

这个怎么样

if (preg_match('/^\d+(\.\d{2})?$/', $subject))
{
   // correct currency format
} else {
  //invalid currency format
}

【讨论】:

    【解决方案3】:

    您可能需要考虑使用正则表达式的其他替代方法。

    例如,NumberFormatter 类提供灵活的数字和货币 parsingformatting,并内置国际化支持。

    它内置于 PHP 5.3 及更高版本中,可作为 PHP 5 早期版本的扩展。

    【讨论】:

      【解决方案4】:

      试试这个正则表达式:

      ^(?:[1-9]\d+|\d)(?:\.\d\d)?$
      

      【讨论】:

      • 我试过这个。返回 (preg_match('^(?:[1-9]\d+|\d)(?:\.\d\d)?$', $vale)) ?真假;并且只是得到错误消息:preg_match()[function.preg-match]:没有找到结束分隔符'^'。添加它一切都会过去。
      • preg_match('/^(?:[1-9]\d+|\d)(?:\.\d\d)?$/')
      • preg_* 函数使用需要用分隔符包围的 PCRE。见docs.php.net/manual/en/intro.pcre.php
      • 仍然允许无效字符。返回 (preg_match('/^(?:[1-9]\d+|\d)(?:\.\d\d)?$/', $this->price) )?真假;允许任何字母字符
      • @Lee:您应该在一个简单的脚本中测试表达式(例如单元测试):它应该按预期工作。我看不出它如何允许使用 alpha 字符。实际上,它没有(我刚刚测试过)。