我正在使用一个正则表达式,它将数值与最多用户定义的小数位数相匹配。目前我有
/(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/
这将允许尽可能多的地方输入,但我也希望有时允许2为货币或4或更多的其他输入。我正在构建的功能是
var isNumeric = function(val, decimals) {
// decimals is not used yet
var objRegExp = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
return objRegExp.test(val);
};
答案 0 :(得分:18)
/^\s*-?[1-9]\d*(\.\d{1,2})?\s*$/
宽恕空白(\ s)是件好事。以上不允许从零开始。如果你想允许:
/^\s*-?\d+(\.\d{1,2})?\s*$/
以上两者都不允许在小数位之前没有任何内容的十进制数字。如果你想允许:
/^\s*-?(\d+(\.\d{1,2})?|\.\d{1,2})\s*$/
答案 1 :(得分:5)
尝试这样的事情:
^\d+\.\d{0,3}$
其中“3”是允许的最大小数位数。
答案 2 :(得分:3)
我通过交易成为C#家伙,但我发现C#或The Regulator等RegexPal等工具在尝试将Regex调整为“就是这样”时非常有用。
答案 3 :(得分:3)
感谢所有人。我在所有答案中都使用了一点。
var isNumeric = function(val, decimalPlaces) {
// If the last digit is a . then add a 0 before testing so if they type 25. it will be accepted
var lastChar = val.substring(val.length - 1);
if (lastChar == ".") val = val + "0";
var objRegExp = new RegExp("^\\s*-?(\\d+(\\.\\d{1," + decimalPlaces + "})?|\\.\\d{1," + decimalPlaces + "})\\s*$", "g");
if (decimalPlaces == -1)
objRegExp = new RegExp("^\\s*-?(\\d+(\\.\\d{1,25})?|\\.\\d{1,25})\\s*$", "g");
return objRegExp.test(val);
};
答案 4 :(得分:3)
如果最后一位是“。”,则添加0。不包括点后的空格。
我认为这涵盖了所有情况,但你想比我在这里更严格地测试它。
var isNumeric = function(val, decimals) {
if (decimals <= 0) {
var re = /^\s*\d+\.?\s*$/;
return re.test(val);
} else {
var reString = "^\\s*((\\d+(\\.\\d{0," + decimals + "})?)|((\\d*(\\.\\d{1," + decimals + "}))))\\s*$"
var re = new RegExp(reString);
return re.test(val);
}
};
var test = function(val, decimals) {
document.write("isNumeric(" + val + ", " + decimals + ") = " + isNumeric(val, decimals) + "<br/>");
}
test("123", 0);
test("123", 5);
test(" 123.45", 2);
test(" 123.45", 3);
test(" 123.45", 1);
test(" ", 0);
test(" ", 5);
test(" 3.", 0);
test(" 3.", 12);
test(" .", 3);
test(" .321 ", 5);
答案 5 :(得分:1)
这应该匹配最多两位小数的整数和小数。
/\A[+-]?\d+(?:\.\d{1,2})?\z/
注意:将“{1,2}”中的“2”更改为您要支持的任意小数位数。
我知道这不是你问题的一部分,但你也可以在没有正则表达式的情况下做到这一点。这是一个解决方案:
var isNumeric = function( val, decimals ) {
if ( parseFloat( val ) ) {
var numeric_string = val + '';
var parts = numeric_string.split( '.', 1 );
if ( parts[1] && parts[1].length > decimals ) {
alert( 'too many decimal places' );
}
else {
alert( 'this works' );
}
}
else {
alert( 'not a float' );
}
}
答案 6 :(得分:1)
使用此模式:
[0-9]?[0-9]?(\.[0-9][0-9]?)?
答案 7 :(得分:-1)
试试这个正则表达式,它对我来说很好用:
^\d+\.\d{0,2}$