RegEx(替换所有非数字字符并强制使用2个小数位)

问题描述 投票:1回答:3

我目前正在研究一些正则表达式逻辑来强制输入字段来仅接受(替换/显示)一个数字(没有字母字符)并强制实施2位小数限制......

我不确定如何才能提高效率,并添加(最大)2位小数限制/限制?

这是我目前的keyup()函数

$("#amount").on("keyup", function(){

    var valid = /^\d{0,9}(\.\d{0,2})?$/.test(this.value);
    val = this.value;

    if(!valid){
        console.log('bad character found');

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

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

        //enforce only (max) 2 decimal places
    }   
});

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

var valid = /^\d{0,9}(\.\d{0,2})?$/.test(this.value);
val = this.value;

if(!valid){
    //console.log("Invalid input!");
    this.value = val.substring(0, val.length - 1);
}

要清楚......

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

  • 没有逗号(根本)
  • 只允许1个小数/句点
  • 而小数不是 - 需要 - 如果存在,确保在该期间后只有2个小数位

更新1:

好吧..所以我有'接近'的东西(虽然一行REGEX会很好!)

我最后一个'待办事项'是以某种方式强制执行(如果有一个'点'......它后面只有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){
        console.log('bad character found');

        var dotCheck = val.indexOf("..");
        if(dotCheck >= 0){
            console.log('DOT CHECK: ' + dotCheck);
            console.log("PRE VAL: " + val);
            val = val.replace("..", "?");
            console.log("POST VAL: " + val);
        }       

        //strip out commas                      
        val = val.replace(/,/g , "");                           
        console.log("AFTER COMMA VAL: " + val);

        //strip out all non-numeric characters (leaving decimal)
        val = val.replace(/[^0-9.]/g, "");
        console.log("AFTER CHAR VAL: " + val);

        //output to field
        this.value = val;

    }

});

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

  • 没有逗号
  • 没有数字/数字之外的字符
  • 没有双'..'(点)
  • 小数点后不超过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; } });

编辑:我发现这不能处理像L这样的东西

1.9.9(无赖)

javascript jquery regex validation currency
3个回答
1
投票

这是您最终编辑的修改版本...我添加了一行来检查情况:1.2.3并用模式替换它以删除第二个点。没有看后面因为它可能不受支持。这是一行:val = val.replace(/(\.)(.)(\.)/g, ".$2"); ".$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替换将调用组#2,在这种情况下是通配符。


0
投票

我觉得你对你正在处理的订单很满意。确保您重新使用val变量。上面的代码将val设置为等于this.value,但是在每个模式之后,您将替换为this.value而不是重新使用val。您只会看到上次替换呼叫的结果。

您查找任何非数字字符的模式都可以。唯一的效率可能是将它与逗号检查结合使用逻辑OR(|),如下所示:\d{0,9}(\.\d{0,2})?|,

至于强制两个小数位,你可以使用这样的东西:(?<=\.[0-9]{2}).+。这是一个积极的背后:(?<= PATTERN )并将返回具有该模式的匹配。这是一个细分:

  • (?<= - 正面观察的开始
  • \.[0-9]{2} - 匹配后面带有2个数字的十进制字符('。')
  • ) - 背后的正面看法结束
  • .+ - 在后视模式之后的任何东西

您可以使用它来替换空白字符串,就像使用其他模式一样。如果点后面只有一个小数(例如:123.4),则不会被替换,因为“.4”与后面的正面外观不匹配。像:this.value = this.value.replace(/(?<=\.[0-9]{2}).+/g, "");

**注意:在https://regexr.com/上测试的模式,但在js代码中没有


0
投票

尝试:^(\d+)(\.\d{2})?$

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'
© www.soinside.com 2019 - 2024. All rights reserved.