3

我已经Range(decimal, decimal,...)在模型中申请了我的财产。它不验证.99,但验证0.99

如何让前导零?

4

1 回答 1

1

这是 ASP.NET MVC 3 默认附带的数字正则表达式jquery.validate.jsjquery.validate.min.js文件中的一个错误。

这是来自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);
}

此函数针对数字正则表达式执行字符串测试。要修复它,请将正则表达式替换为以下内容:/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.

这是一个简短的版本。现在解释一下:

错误的正^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$则表达式读取为:

^-?
  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})+)检查第一组并且验证失败,因为必须匹配第一组。

如果我们将参考http://docs.jquery.com/Plugins/Validation/Methods/number演示并检查他们的正则表达式以进行数字验证,它将如下所示^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$:这与 buggy one 相同,但现在第一个匹配组应该是zero or one repetitions可选的。正则表达式中的这个附加?修复了错误。

编辑:这也适用于 MVC 4 默认模板。两个模板都使用 1.9.0 版本的插件。在 1.10.0 版本中,此问题已修复。从变更日志

  • 修复了没有前导零的小数的正则表达式问题。添加了新方法测试。修复 #41

所以有时保持更新是个好主意。

于 2013-02-14T16:35:08.030 回答