1

我目前需要一个 reg 表达式来评估十进制范围。

要求如下

1) 点后只能允许 1 或 2 个小数位,也可以允许整数(例如)1234、123.4、1245.78 有效

2) 范围应在 9999 以内(例如) 9999.0 、 9998.99 、 9999.00 - 有效 | 9999.01,10000.00 - 无效

3) 不需要前导零或尾随零

到目前为止,我一直试图实现直到写这个 reg 表达式

/^[0-9]\d{1,4}(\.\d{1,2})?$/.test(value);

...但无法继续设置范围直到数字 9999(因为 9999.01 也无效)你能帮忙吗?

4

4 回答 4

2

为什么不只应用正则表达式来确定您的字符串是否为有效digit with dots浮点数,然后将其类型转换为 Number 并查找它是否大于 9999。

满足您需求的正则表达式可能非常复杂,并且从客户端占用过多的 CPU。

于 2012-09-03T10:07:48.397 回答
0

这里有一些快速而肮脏的东西应该适合你:http ://regex101.com/r/vK1jM3

/^(?(?=9999)9999(?:\.0+)?|\d{1,4}(?:\.\d{1,2})?)$/gm

我只处理特殊情况9999

于 2012-09-03T10:06:43.453 回答
0

为什么是正则表达式?做就是了

x > 0 && x <= 9999 && (x*100 - Math.floor(x*100) == 0)
于 2012-09-03T11:08:44.827 回答
0

据我所知,这有效:

^(9999(?!\.[1-9])(?!\.0[1-9])\.[0-9]{1,2}|9999|(?!9999)[0-9]{1,4}|(?!9999)[0-9]{1,4}\.[0-9]{1,2})$

测试一下:

var monstrosity = /^(9999(?!\.[1-9])(?!\.0[1-9])\.[0-9]{1,2}|9999|(?!9999)[0-9]{1,4}|(?!9999)[0-9]{1,4}\.[0-9]{1,2})$/;

console.log(monstrosity.test("9999.00")); // true
console.log(monstrosity.test("9999.01")); // false
console.log(monstrosity.test("9999")); // true
console.log(monstrosity.test("9998.4")); // true
console.log(monstrosity.test("0")); // true
console.log(monstrosity.test("0.5")); // true

如果你在代码库中添加这样的东西,未来的维护程序员会用干草叉来追捕你。正如 webbandit 建议的那样,尝试在没有正则表达式的情况下解决范围检查。

于 2012-09-03T10:52:51.083 回答