Javascript 正则表达式(替换所有非数字字符并包含2位小数)

Javascript 正则表达式(替换所有非数字字符并包含2位小数),javascript,jquery,regex,validation,currency,Javascript,Jquery,Regex,Validation,Currency,我目前正在研究一些正则表达式逻辑,以强制字段的输入只接受(替换/显示)一个数字(无字母字符),并强制执行小数点后2位的限制 我不知道如何才能提高效率,并增加(最大)2位小数限制/限制 下面是我当前使用的keyup()函数 我最初使用的是这个,但它有缺陷(如果返回并在当前/现有数字中添加逗号,它会删除字段中的最后一个数字/字符…(即使该字符不是违规字符) 说清楚 该值不必有小数点,并且在所述小数点后强制2位。但是如果有,我需要在小数点后强制执行2个字符的限制 没有逗号(完全没有) 仅允许1个小数

我目前正在研究一些正则表达式逻辑,以强制字段的输入只接受(替换/显示)一个数字(无字母字符),并强制执行小数点后2位的限制

我不知道如何才能提高效率,并增加(最大)2位小数限制/限制

下面是我当前使用的keyup()函数

我最初使用的是这个,但它有缺陷(如果返回并在当前/现有数字中添加逗号,它会删除字段中的最后一个数字/字符…(即使该字符不是违规字符)

说清楚

该值不必有小数点,并且在所述小数点后强制2位。但是如果有,我需要在小数点后强制执行2个字符的限制

  • 没有逗号(完全没有)
  • 仅允许1个小数/句点
  • 虽然不需要小数-…如果存在,请确保句点后只有2位小数
更新1:

好的,我已经“接近”了(虽然一行正则表达式就好了!)

我的最后一个“待办事项”是以某种方式强制执行(如果有一个“点”…它后面只有两个小数位…。尽管点/小数位是-不-必需的)

最终更新:
(最终工作解决方案)…仍在查看下面发布的正则表达式解决方案

  • 没有逗号
  • 数字/数字之外没有字符
  • 没有双“…”(点)
  • 小数点后不超过2位

    $("#amount").on("keyup", function(){                            
        var valid = /^\d{0,9}(\.\d{0,2})?$/.test(this.value);
    val = this.value;
    
    if(!valid){
        var dotCheck = val.indexOf("..");
        if(dotCheck >= 0){                              
            val = val.replace("..", ".");
        }
    
        //strip out commas                                          
        val = val.replace(/,/g , "");                           
    
        //strip out all non-numeric characters (leaving decimal)                            
        val = val.replace(/[^0-9.]/g, "");
    
        //enforce 2 decimal places (max)                    
        var totalLength = val.length;
        var only2DecimalsCount = val.indexOf(".");
    
        if(only2DecimalsCount >= 0 && totalLength > (only2DecimalsCount + 2)){                          
            val = val.substring(0, (only2DecimalsCount + 3));
        }                           
    
        //output to field
        this.value = val;                           
    }
    
    
    });
    
编辑:我发现这不能处理像


1.9.9(不愉快)我认为您对处理的顺序没有问题。请确保您使用的是
val
变量。上面的代码将
val
设置为
this.value
,但在每个模式之后,您将替换为
this.value
而不是重复使用
val
。您将只看到上次替换呼叫的结果

您查找任何非数字字符的模式很好。唯一有效的方法可能是使用逻辑OR(|)将其与逗号检查结合起来,如:
\d{0,9}(\.\d{0,2})?|,

至于强制执行两位小数,您可以使用如下内容:
(?尝试:
^(\d+)(\。\d{2})?$

更新:替换多个“.”字符的正则表达式

s = '123...45'
s.replace(/(\.)+/g, '.')
// '123.45'

这是您最终编辑的一个修改版本…我添加了一行来检查情况:1.2.3,并用一个图案替换它以删除第二个点。由于可能不受支持,所以没有向后看。这是一行:
val=val.replace(/(\)(\)(\)/g,“.2”);
the
”$2“
将用一个点和模式组替换.#。在本例中,模式组是通配符(.)。您在底部的另一个检查将捕获一个双点”。”

$("#amount").on("keyup", function () {
    var valid = /^\d{0,9}(\.\d{0,2})?$/.test(this.value);
    val = this.value;
    console.log("ORIGINAL VAL: " + val);

    if (!valid) {
        var dotCheck = val.indexOf("..");
        if (dotCheck >= 0) {
            val = val.replace("..", ".");
        }

        val = val.replace(/(\.)(.)(\.)/g, ".$2");

        //strip out commas                                          
        val = val.replace(/,/g, "");

        //strip out all non-numeric characters (leaving decimal)                            
        val = val.replace(/[^0-9.]/g, "");

        //enforce 2 decimal places (max)                    
        var totalLength = val.length;
        var only2DecimalsCount = val.indexOf(".");

        if (only2DecimalsCount >= 0 && totalLength > (only2DecimalsCount + 2)) {
            val = val.substring(0, (only2DecimalsCount + 3));
        }

        //output to field
        this.value = val;
    }
});

编辑:通过添加括号修复了新行。说明:括号将模式的各个部分“分组”在一起(基于1的索引)。因此新行有3个组-
(\)-1、()-2、(\)-3
。替换为
$2
将调用group#2,在本例中是通配符。

我认为我的测试部分很好…不是?(除了可能没有捕捉到多个点之外??如何替换它们?我添加了一个字符串replace regex,用于替换字符串中的多个“.”字符。
s.replace(/(\)+/g'))
谢谢。这仍然允许在字段中输入类似“1.8.”的内容(即:允许输入第二个小数点)我最初发布的正则表达式测试返回该测试的
false
。因此,使用我在OP中最新更新的方法……我可以添加一行新行来解决这些问题吗?我还无法让javascript replace()函数工作?var dotCheck=val.indexOf(“…”);如果(dotCheck>=0){console.log('dotCheck:'+dotCheck);console.log(“PRE-VAL:+VAL”);this.value=VAL.replace(“…”,“?”);console.log(“POST-VAL:+VAL”);}编辑了我的答案。字符串的开头(^)和结尾($)输入字段中的字符对我不起作用。请尝试删除它们,然后再试一次……这对我起作用:
val=val.replace(/(?^是否进行替换(无逗号,允许小数,但仅允许1?,…小数后仅2位?)---所以我很清楚..这应该替换我在原始帖子中编辑的解决方案?SyntaxError:使用上述建议的解决方案的regexp组无效我在解决方案的第一个模式中有语法错误。编辑以修复它。我一定是复制了错误的解决方案。最后一条注释是对您的编辑的补充。它将替换小数点和2个数字。例如:123.4567变为123.45;12.34.56变为12.34。希望这有帮助。使用你的新行得到奇怪的结果。有没有理由它会“改变”(向上/向下/递增)第二个“点”之前的数字?例如..我键入1.8。(当第二个点出现时,8变为“2”?)嗯?LOLIt忽略了$符号。所以它始终是1.2。我正在研究如何在括号中修复此问题,使其成为组。现在编辑答案。已售出!似乎到目前为止只需将其添加到我的当前队列中即可。谢谢!我将继续玩,看看是否可以打破它。但现在…已接受答案!太好了。我会留意你的。祝你好运,快乐:)
$("#amount").on("keyup", function(){                            
    var valid = /^\d{0,9}(\.\d{0,2})?$/.test(this.value);
val = this.value;

if(!valid){
    var dotCheck = val.indexOf("..");
    if(dotCheck >= 0){                              
        val = val.replace("..", ".");
    }

    //strip out commas                                          
    val = val.replace(/,/g , "");                           

    //strip out all non-numeric characters (leaving decimal)                            
    val = val.replace(/[^0-9.]/g, "");

    //enforce 2 decimal places (max)                    
    var totalLength = val.length;
    var only2DecimalsCount = val.indexOf(".");

    if(only2DecimalsCount >= 0 && totalLength > (only2DecimalsCount + 2)){                          
        val = val.substring(0, (only2DecimalsCount + 3));
    }                           

    //output to field
    this.value = val;                           
}


});
s ='1234567'
/^(\d+)(\.\d{2})?$/.test(s)
// true

s ='12345.67'
/^(\d+)(\.\d{2})?$/.test(s)
// true

s ='12345.678'
/^(\d+)(\.\d{2})?$/.test(s)
// false

s ='123.45.67'
/^(\d+)(\.\d{2})?$/.test(s)
// false

s ='a12345.67'
/^(\d+)(\.\d{2})?$/.test(s)
// false
s = '123...45'
s.replace(/(\.)+/g, '.')
// '123.45'
$("#amount").on("keyup", function () {
    var valid = /^\d{0,9}(\.\d{0,2})?$/.test(this.value);
    val = this.value;
    console.log("ORIGINAL VAL: " + val);

    if (!valid) {
        var dotCheck = val.indexOf("..");
        if (dotCheck >= 0) {
            val = val.replace("..", ".");
        }

        val = val.replace(/(\.)(.)(\.)/g, ".$2");

        //strip out commas                                          
        val = val.replace(/,/g, "");

        //strip out all non-numeric characters (leaving decimal)                            
        val = val.replace(/[^0-9.]/g, "");

        //enforce 2 decimal places (max)                    
        var totalLength = val.length;
        var only2DecimalsCount = val.indexOf(".");

        if (only2DecimalsCount >= 0 && totalLength > (only2DecimalsCount + 2)) {
            val = val.substring(0, (only2DecimalsCount + 3));
        }

        //output to field
        this.value = val;
    }
});