带有小数和千位分隔符的数字的正则表达式

IT技术 javascript regex decimal
2021-01-31 17:53:44

我需要正则表达式来使用 javascript 验证一个可能包含千位分隔符或小数的数字。最大值为9,999,999.99 最小值0.01 其他有效值: 11,111 11.1 1,111.11

无效值: 1111 1111,11 ,111 111,

我没有快乐地到处寻找。

6个回答
/^\d{1,3}(,\d{3})*(\.\d+)?$/

关于最小值和最大值......好吧,我不会用正则表达式来做,但你可以在开始时添加前瞻:

/^(?!0+\.00)(?=.{1,9}(\.|$))\d{1,3}(,\d{3})*(\.\d+)?$/

注意:这允许0,999.00,因此您可能需要将其更改为:

/^(?!0+\.00)(?=.{1,9}(\.|$))(?!0(?!\.))\d{1,3}(,\d{3})*(\.\d+)?$/

这不允许前导 0。

编辑:
测试:http : //jsfiddle.net/pKsYq/2/

@RyanDaulton 问题指定的最大值为9,999,999.99,低于10,029,589.84
2021-03-15 17:53:44
@Swifty 我不好,我认为需要小数。我正在改变它。
2021-03-21 17:53:44
感谢您的快速回复 Loamhoof 虽然不高兴。我这样调用它但它失败了: var re = new RegExp("/(?!0+\.00)(?!.{10,}\.)(?!0,?\d)\d {1,3}(,\d{3})*\.\d+/"); if (!min.match(re)) { alert('No match'); }
2021-03-25 17:53:44
@Swifty 你能举一个失败的例子吗?
2021-04-08 17:53:44
我正在使用这个页面来测试它:正则表达式测试器如果我输入“1”,它就会失败。
2021-04-13 17:53:44
((\d){1,3})+([,][\d]{3})*([.](\d)*)?

它适用于一些,但我仍在学习正则表达式。

逻辑应该是 1-3 位数字 0-1 次,1 个逗号后跟任意次数的 3 位数字,以及单个 . 后跟任意数量的数字 0-1 次

你能给出失败的案例吗?
2021-03-17 17:53:44
以某种方式返回一切有效?
2021-03-18 17:53:44
蒙克也没有快乐。
2021-03-23 17:53:44
已编辑,应该是 + 而不是 ? 对于第一个子表达式。
2021-04-04 17:53:44
@Swifty * 和?等于可选,\d{1,3}+ 等于至少 1 位数字。没有用 ^ 和 $ 将 this 括起来,相当于“至少包含 1 位数字”
2021-04-13 17:53:44

Tezra 的公式对于“1”失败。或“1.0”。出于我的目的,我允许前导和尾随零,以及前导 + 或 - 符号,如下所示:

^[-+]?((\d{1,3}(,\d{3})*)|(\d*))(\.|\.\d*)?$

首先,我想指出,如果您拥有数据来自的表单,那么限制输入的最佳方法是使用正确的表单元素(又名,数字字段)

<input type="number" name="size" min="0.01" max="9,999,999.99" step="0.01">

是否可以输入“,”取决于浏览器,但浏览器总是会给你一个实际数字的值。(请记住,所有表单数据也必须在服务器端进行验证/清理。永远不要相信客户端)


其次,我想扩展更强大(独立于平台)/可修改正则表达式的其他答案。

  • 您应该用 ^ 和 $ 包围正则表达式,以确保匹配整个数字,而不仅仅是它的一个子集。前任^<my_regex>$
  • 小数点右边是可选的,所以我们可以把它放在一个可选的组中 (<regex>)?
  • 匹配文字句点而不是任何数字链很简单 \.\d+
    • 如果你想坚持小数点后的最后一个数字不是 0,你可以使用[1-9]“非零数字”,所以\.\d+[1-9]
  • 对于小数点的左边,前导数字将为非零,或者数字为零。所以([1-9]<rest-of-number-regex>|0)
  • 第一组数字将是 1-3 位数字,因此 [1-9]\d{0,2}
  • 之后,我们必须在 3s 中添加数字,所以 (,\d{3})*
    • 记住 ?意味着可选,所以要使 , optional 只是(,?\d{3})*

把这一切放在一起

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

我在下面的正则表达式中使用了以下限制 -

^(?!0|\.00)[0-9]+(,\d{3})*(.[0-9]{0,2})$
  1. 不允许 0 和 .00。
  2. ','(千位分隔符)后 3 位。
  3. '.' (小数点最多保留 2 位小数)。