2014-01-05 60 views
2

我需要验证的输入值,0〜99.99,浮子式,和小数点后只有两位数字,像验证输入的浮点格式

有效例如:

0 
1 
.1 
.12 
12.12 

无效例如:

(empty) 
100 
123.1 
.123 
12.123 

所以我创建这个正则表达式

var isValid = new RegExp(/^\d{1,2}(\.\d{0,2})?$/).test(parseFloat($('#myText').val())); 

任何其他方式检查?使代码更容易和更简单。

+0

023.1呢?它应该被认为是有效的吗?承认前导零将是有意义的。 – user2314737

+0

是的,你的建议是必要的。我认为023意味着23! – Kevin

回答

2

您可以尝试使用正则表达式:

^\d{1,2}(?:\.\d{1,2})?$|^\.\d{1,2}$ 

regex101 demo

的正则表达式是两个部分:

^\d{1,2}(?:\.\d{1,2})?$这将接受数字与2位,一个可能的小数的最多两个十进制数字。

^的行的开头相匹配,

\d{1,2}任何数量的匹配至少1时间和至多2倍。

(?: ...)是非捕获组(这使得正则表达式稍微更有效的通过不必保持捕获的组)

?近终点指示0或1次,

$指示结束的线(从而确保没有更多的号码)。

第二部分^\.\d{1,2}$接受第一位可以不存在的小数,因此.1将通过。

第一和第二部分与|(或运营商)连接,这意味着,如果比赛为第一部分出现故障时,发动机将与第二部分尝试称这是一个不匹配的

+0

似乎更复杂。但可能更强大。良好的网站btw。 – Kevin

+0

@凯文谢谢。这不是比第一个答案更复杂,你会注意到他们的正则表达式改变了很像我的;) – Jerry

+0

是的,最初我看着凯文的正则表达式,并认为它看起来是正确的,所以我的答案专注于其他事情,但他的评论(在我的回答下)促使我看得更仔细一些。 +1正确的第一个得到正则表达式。 – nnnnnn

2

“使代码更简单。”

好的。在这里你去:

var isValid = /^\d{1,2}(\.\d{0,2})?$|^\.\d\d?$/.test($('#myText').val()); 

你并不需要使用new RegExp()当你已经有一个字面正则表达式。

您的正则表达式不接受.作为第一个字符。

如果您将parseFloat()的结果传递给.test(),那么您不验证用户实际输入的内容,因为parseFloat()忽略了前导空格和尾随非数字数据。所以你的代码会接受,例如," 12abc"有效。如果你真的希望忽略前导空间或尾随空间,你可以在你的正则表达式中使用。

+0

听起来不错。我现在感觉好多了。内部正则表达式脚本怎么样? – Kevin

+0

我错过了什么吗?从什么时候开始在JavaScript中定义变量的数据类型? –

+0

谢谢@MicahHenning - 显然我只是从问题中复制出来而没有考虑它。固定。 – nnnnnn

0

这里之前是一个正则表达式,也接受前导和尾随零:http://regex101.com/r/hV1uD8

/^(?:0*\d{1,2})(?:\.\d{0,2}0*)?$|^(?:0*\.)(?:\d{1,2}0*)$/ 

有效例子:

0 
1 
.1 
.12 
12.12 
23.1 
023.1 
12.1200 
012.120 
1. 
1.010 

无效:

100 
123.1 
.123 
12.123 
12.1201 

或者你可以使用parseFloat采取的开头和结尾的零和关怀然后正则表达式中的其他答案建议:

var isValid = /^\d{1,2}(?:\.\d{1,2})?$|^\.\d{1,2}$/.test(parseFloat($('#myText').val())); 

但是这肯定是因为你会效率低解析相同的表达式两次。

+0

我认为使用parseFloat可能会使代码变得微不足道。但是当我parseFloat('023')我得到了'19'。它似乎不是我想要的! – Kevin

+0

所以,也许我应该在正则表达式测试之前修剪('0')。 – Kevin