Javascript百分比验证

时间:2008-10-23 01:02:19

标签: javascript regex

我正在使用一个正则表达式来验证0 100的百分比并允许两个小数位。

有没有人知道如何做到这一点,或者知道在javascript中有用于客户端验证的常见正则表达式示例的优秀网站?

@Tom - 感谢您的提问。理想情况下,不会有前导0或其他尾随字符。

感谢所有回复的人。我发现这些评论非常有趣。

10 个答案:

答案 0 :(得分:30)

我不是将正则表达式用于此,而是将用户输入的数字转换为浮点值,然后检查所需的范围(0到100)。尝试使用正则表达式进行数值范围验证几乎总是错误的工具。

var x = parseFloat(str);
if (isNaN(x) || x < 0 || x > 100) {
    // value is out of range
}

答案 1 :(得分:11)

我建议这个:

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

使用此部分匹配100,100.0和100.00

^100(\.0{1,2})?$

和数字,如0,15,99,3.1,21.67使用

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

注意禁止前导零,但允许尾随零(但不超过两位小数)。

答案 2 :(得分:5)

这让我想起an old blog Entry亚历克斯帕帕迪莫里斯(The Daily WTF成名),他讲述了以下故事:

  

“一位客户要我建造并安装一个定制的搁架系统。我正处于需要钉钉的地步,但我不知道该用什么来敲钉子。我应该使用一个旧鞋还是玻璃瓶?“

     

你会如何回答这个问题?

     
      
  1. 这取决于。如果你想在干墙上砸一个小的(20磅)钉子,你会发现使用瓶子更容易,特别是如果鞋子很脏的话。但是,如果你试图将一根沉重的钉子钉在一些木头上,那么就去买一双鞋:手中的碎瓶。

  2.   
  3. 你的建筑方式存在根本性的错误;你需要使用真正的工具。是的,它可能涉及到工具箱(甚至是硬件商店)的旅行,但以正确的方式这样做会在产品的生命周期中节省大量的时间,金钱和恶化。在了解施工基础知识之前,你需要停止建造物资。

  4.   

这是一个大多数人认为提出正确的正则表达式来解决问题的挑战,但是说使用正则表达式使用错误的工具来解决问题要好得多

尝试使用正则表达式验证数值范围时的问题是,如果允许范围的要求发生更改,则很难更改。今天的要求可能是验证0到100之间的数字,并且可以为不会让你的眼睛流血的那个写一个正则表达式。但下周的要求可能会发生变化,因此允许0到315之间的值。好运改变你的正则表达式。

Greg Hewgill给出的解决方案可能更好 - 尽管它会将“99fxx”验证为“99”。但鉴于情况可能确实没问题。

答案 3 :(得分:1)

鉴于您的值在str

str.match(/^(100(\.0{1,2})?|([0-9]?[0-9](\.[0-9]{1,2})))$/)

答案 4 :(得分:0)

  

(100|[0-9]{1,2})(\.[0-9]{1,2})?

那应该是你想要的正则表达式。我建议你阅读掌握正则表达式并下载RegexBuddy或The Regex Coach。

答案 5 :(得分:0)

^100(\.(0){0,2})?$|^([1-9]?[0-9])(\.(\d{0,2}))?\%$

这符合:
100.00
可选的“1-9”后跟一个数字(这使得int部分),可选地后跟一个点和两个数字


从我看来,Greg Hewgill的例子并没有那么好用,因为 parseFloat('15x')只返回15,它将匹配0&lt; x&lt; 100条件。使用 parseFloat 显然是错误的,因为它不验证百分比值,它会尝试强制进行验证。这里的一些人抱怨领先零,有些人忽略尾随无效字符。也许问题的作者应该编辑它并明确他需要的东西。

答案 6 :(得分:0)

@mlarsen: 这不是一个正则表达式不会做得更好。

请记住,无论是在客户端还是在服务器端都要进行验证,例如:

100|(([1-9][0-9])|[0-9])(\.(([0-9][1-9])|[1-9]))?

将是一种跨语言检查,只要注意检查输出长度与输出匹配长度。

答案 7 :(得分:0)

如果您不是专门为英语用户开发的话,我建议您这样做:

[0-9]{1,2}((,|\.)[0-9]{1,10})?%?

您可以简单地将10替换为2以获得两位小数。

我的例子将匹配:

15.5
5.4366%
1,43
50,55%
34
45%

原因是这个的输出更难以投射,但是这样的事情会做(Java代码):

private static Double getMyVal(String myVal) {
    if (myVal.contains("%")) {
        myVal = myVal.replace("%", "");
    }
    if (myVal.contains(",")) {
        myVal = myVal.replace(',', '.');
    }
    return Double.valueOf(myVal);
}

答案 8 :(得分:0)

LabelDemo

答案 9 :(得分:0)

上述解决方案都不适用于我,因为我需要我的正则表达式在用户键入 ex: '18.' 时允许包含数字和小数的值。

此解决方案允许使用空字符串,以便用户可以删除他们的整个输入,并考虑上面阐明的其他规则。

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