我已将Range(decimal, decimal,...)
应用于我的模型中的属性。它不会验证.99
,但会验证0.99
。
如何让领先的零?
答案 0 :(得分:1)
这是jquery.validate.js
和jquery.validate.min.js
文件中的数字regexp中的一个错误,默认情况下是ASP.NET MVC 3。
以下是来自jquery.validate.js
的代码,第1048行:
// http://docs.jquery.com/Plugins/Validation/Methods/number
number: function(value, element) {
return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value);
}
此函数对数字正则表达式执行字符串测试。要解决此问题,请将regexp替换为以下一个:/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/
。
这是一个简短的版本。现在这里是解释:
Buggy ^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$
regexp读作:
^-?
Beginning of line or string
-, zero or one repetitions
Match expression but don't capture it. [\d+|\d{1,3}(?:,\d{3})+]
Select from 2 alternatives
Any digit, one or more repetitions
\d{1,3}(?:,\d{3})+
Any digit, between 1 and 3 repetitions
Match expression but don't capture it. [,\d{3}], one or more repetitions
,\d{3}
,
Any digit, exactly 3 repetitions
Match expression but don't capture it. [\.\d+], zero or one repetitions
\.\d+
Literal .
Any digit, one or more repetitions
End of line or string
如您所见,第二个捕获组(?:\.\d+)?
允许使用.XX
格式的数字,但在匹配时,首先检查第一个组(?:\d+|\d{1,3}(?:,\d{3})+)
,然后验证失败,因为第一个组必须< / em>匹配。
如果我们要参加http://docs.jquery.com/Plugins/Validation/Methods/number演示并检查其正则表达式以进行数字验证,它将如下所示:^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$
。这与错误的一个相同,但现在第一个匹配的组应该是zero or one repetitions
或可选。正则表达式中的这个额外的?
修复了错误。
编辑:这也适用于MVC 4默认模板。两个模板都使用1.9.0版本的插件。在版本1.10.0中,此问题已得到修复。来自changelog:
所以有时保持更新是一个好主意。