【问题标题】:Regex that matches numeric with up to 2 decimal places匹配最多 2 位小数的数字的正则表达式
【发布时间】:2009-03-19 00:50:34
【问题描述】:

我正在使用一个正则表达式,它将匹配最多包含用户定义的小数位数的数值。目前我有

/(^-?\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);
};

【问题讨论】:

    标签: javascript regex


    【解决方案1】:
    /^\s*-?[1-9]\d*(\.\d{1,2})?\s*$/
    

    原谅空格 (\s) 很好。以上不允许从零开始。如果你想允许这样做:

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

    以上都不允许小数点前没有任何内容的十进制数。如果你想允许这样做:

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

    【讨论】:

    • 您是否有一个变体,它允许在. 后面不带任何数字? JavaScript 认为这是一个有效数字,只要没有 两个 尾随点 (isNaN(1.) //false)
    【解决方案2】:

    试试这样的:

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

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

    【讨论】:

    • According to MDN,量词 x{n,m} 要求“n 和 m 是 整数”——即,0 不是有效的下限。 But the spec says 表示nm 的类型是DecimalDigits,所以允许为0。 MDN 在这里是错误的:您的表达式符合规范并且可以在任何浏览器中安全使用。
    【解决方案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);
    

    【讨论】:

      【解决方案4】:

      我是一名 C# 专业人士,但我发现像 The Regulator for C# 或 RegexPal 这样的工具在尝试将 Regex 调整为“恰到好处”时非常有用。

      【讨论】:

        【解决方案5】:

        谢谢大家。我从所有答案中使用了一点。

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

        【讨论】:

          【解决方案6】:

          试试这个正则表达式,它对我来说很好用:

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

            • 这无法使用以下语法匹配具有一位或两位的整数或小数:var regex = new Regex("/\\A[+-]?\\d+(?:\\ .\\d{1,2})?\\z/"); if (regex.IsMatch("1234")) {
            【解决方案8】:

            使用这个模式:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-08-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-05-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多