Javascript 与最多2位小数的数字匹配的正则表达式

Javascript 与最多2位小数的数字匹配的正则表达式,javascript,regex,Javascript,Regex,我要找的是一个正则表达式,它可以将数值与用户定义的小数位数进行匹配。目前我有 /(^-?\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\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);
};

试着这样做:

^\d+\.\d{0,3}$

其中“3”是允许的最大小数位数

/^\s*-?[1-9]\d*(\.\d{1,2})?\s*$/
原谅空白(\s)是件好事。以上不允许从零开始。如果要允许,请执行以下操作:

/^\s*-?\d+(\.\d{1,2})?\s*$/
/^\s*-?(\d+(\.\d{1,2})?|\.\d{1,2})\s*$/
以上两种方法都不允许小数点前不带任何内容。如果要允许,请执行以下操作:

/^\s*-?\d+(\.\d{1,2})?\s*$/
/^\s*-?(\d+(\.\d{1,2})?|\.\d{1,2})\s*$/

这应该匹配整数和小数,最多两位小数

/\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' );
    }
}

我是一个C#人,但我发现C#之类的工具在试图将正则表达式调整为“一般”时非常有用。

多亏了大家。我使用了所有答案中的一点

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);        
};

如果最后一个数字是“.”,则添加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);
var isNumeric=函数(val,小数){

如果(小数试试这个正则表达式,它对我来说很好:

^\d+\.\d{0,2}$
使用此模式:

[0-9]?[0-9]?(\.[0-9][0-9]?)? 

这无法使用以下语法匹配具有一个或两个位置的整数或小数:var regex=new regex(“/\\A[+-]?\\d+(?:\\.\\d{1,2})?\\z/”;如果(regex.IsMatch(“1234”){,则量词
x{n,m}
要求“n和m为正整数”–也就是说,0不是有效的下限。
n
m
的类型是
小数位数
,因此允许0。MDN在这里是错误的:您的表达式符合规范,并且可以在任何浏览器中安全使用。您是否有一种变体,允许在
后面添加任何数字?JavaScript认为这是错误的有效数字,只要没有两个尾随点(
isNaN(1.)//false