[英]How to validate input field with jQuery Currency formater using Parsley Validate? (Maybe RegEx?)
[英]IE 8 crashes when using regex with to validate currency
我已经写了一堆代码,对支出金额(有效条目32.4554
, 234,324.34
等)。 我另外编写了代码,以限制用户输入超过13位数字( .
和,
除外)。
所有这些都可以在Firefox中完美运行。 但是在IE 8中,位数超过13后,如果输入字母,Internet Explorer将挂起并崩溃! 在调试时,我注意到它在正则表达式行中出错,但是在未超过13的限制之前,相同的正则表达式可以正常工作! 正则专家,请! 给我看看光!
function isIncorrectSpend(cubeCurrencySpend) {
if(!(/^([1-9]*[0-9]*,?[0-9]*)* (\.[0-9]*)?$/.test(cubeCurrencySpend))) {
return true;
}
return false;
}
function isLongerThanThirteenDigits(cubeCurrencySpend) {
cubeCurrencySpend = cubeCurrencySpend.replace(/,/g, "").replace(/\./g, "");
if(cubeCurrencySpend.length>12) {
return true;
}
return false;
}
jQuery("input#minval").keyup( function() {
if(isIncorrectSpend(jQuery("input#minval").val())) {
jQuery("input#minval").val("");
alert("please enter correct spend value");
}
});
jQuery("input#minval").keypress( function(e) {
var code = (e.keyCode ? e.keyCode : e.which);
if(isLongerThanThirteenDigits(jQuery("input#minval").val()) && (code > 47 && code < 58)) {
alert("Please enter a number less than 13 digits");
return false;
}
return true;
});
我很确定这是灾难性的回溯 。 您的正则表达式有太多检查的可能性,直到失败为止。
问题是这部分
([1-9]*[0-9]*,?[0-9]*)*
而且我很确定它没有按照您的期望做。
这将匹配相同的东西,但是会更快地失败:
/^[1-9]*[0-9,]*(\.[0-9]+)?$/
它仍然允许1,。,。,。123之类的东西,但比您的要好得多。 如果您不想这样做,则需要澄清您的要求。
您还可以更改正则表达式以结合长度和有效性检查。
function isIncorrectSpend(cubeCurrencySpend) {
return !/^(?!0)(?:\d[,\.]*){1,13}$/.test(cubeCurrencySpend);
}
该答案假定您希望验证满足以下条件的十进制“数字”:
+
或减号-
。 鉴于上述要求,这里有一些有效和无效的数字
0
0.
.0
0.0
1
+1
-1
1234
123456
1,234
12,345
123,456
123,456.7890
0FA92 // Invalid digit. Must be 0-9.
0123 // Multi-digit integer must lead with non-zero.
. // Must have at least one digit.
1,23,4 // Commas must separate triplets of digits.
12345,678. // Missing comma.
+ 10 // Whitespace not allowed.
1.2E34 // Exponents not allowed.
这是一个正则表达式(首先使用Python方便的原始字符串语法以带注释的自由行模式格式显示),该正则表达式与满足上述要求的数字匹配:
r"""
^ # Anchor to start of string.
[+\-]? # Optional sign.
(?=\.?\d) # Must have at least one digit.
(?: # Optional integer part. Either...
[1-9] # A sequence of digits w/no commas.
\d* # (but first digit is not zero.)
| # or an integer having commas...
[1-9] # First digit is not zero.
\d{0,2} # 1,2 or 3 digits ahead of 1st comma.
(?: # One or more comma + 3 digits.
, # Comma separates
\d{3} # digit triplets.
)+ # One or more comma + 3 digits.
| 0 # or integer part may be just zero.
)? # Optional integer part.
(?: # Optional fractional part.
\. # Dot separates
\d* # zero or more fraction digits.
)? # Optional fractional part.
$ # Anchor to end of string.
"""
这是一个实现上述正则表达式的JavaScript函数:
function isValidNumber(text) {
var re = /^[+\-]?(?=\.?\d)(?:[1-9]\d*|[1-9]\d{0,2}(?:,\d{3})+|0)?(?:\.\d*)?$/;
if((re.test(text))) return 'true';
return 'false';
}
请注意,在用户输入完完整的数字之后,您才应该尝试验证数字。 对每个按键都调用验证功能(就像上面的代码似乎正在做的那样)不是IMHO的好习惯。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.