Javascript 正则表达式(替换所有非数字字符并包含2位小数)
我目前正在研究一些正则表达式逻辑,以强制字段的输入只接受(替换/显示)一个数字(无字母字符),并强制执行小数点后2位的限制 我不知道如何才能提高效率,并增加(最大)2位小数限制/限制 下面是我当前使用的keyup()函数 我最初使用的是这个,但它有缺陷(如果返回并在当前/现有数字中添加逗号,它会删除字段中的最后一个数字/字符…(即使该字符不是违规字符) 说清楚 该值不必有小数点,并且在所述小数点后强制2位。但是如果有,我需要在小数点后强制执行2个字符的限制Javascript 正则表达式(替换所有非数字字符并包含2位小数),javascript,jquery,regex,validation,currency,Javascript,Jquery,Regex,Validation,Currency,我目前正在研究一些正则表达式逻辑,以强制字段的输入只接受(替换/显示)一个数字(无字母字符),并强制执行小数点后2位的限制 我不知道如何才能提高效率,并增加(最大)2位小数限制/限制 下面是我当前使用的keyup()函数 我最初使用的是这个,但它有缺陷(如果返回并在当前/现有数字中添加逗号,它会删除字段中的最后一个数字/字符…(即使该字符不是违规字符) 说清楚 该值不必有小数点,并且在所述小数点后强制2位。但是如果有,我需要在小数点后强制执行2个字符的限制 没有逗号(完全没有) 仅允许1个小数
- 没有逗号(完全没有)
- 仅允许1个小数/句点
- 虽然不需要小数-…如果存在,请确保句点后只有2位小数
(最终工作解决方案)…仍在查看下面发布的正则表达式解决方案
- 没有逗号
- 数字/数字之外没有字符
- 没有双“…”(点)
- 小数点后不超过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;
}
});