我目前正在研究一些正则表达式逻辑来强制输入字段来仅接受(替换/显示)一个数字(没有字母字符)并强制实施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:
好吧..所以我有'接近'的东西(虽然一行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;
}
});
更新最终: (最终工作解决方案)...仍然检查下面发布的正则表达式解决方案...
$("#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(无赖)
这是您最终编辑的修改版本...我添加了一行来检查情况: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,在这种情况下是通配符。
我觉得你对你正在处理的订单很满意。确保您重新使用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代码中没有
尝试:^(\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'