我对正则表达式很新,我对正则表达式有问题。
我想只允许用户输入正数,有或没有一个点,最多2位小数(也可能只有1位小数)。当用户在文本框中键入文本时,如果他们输入了错误的格式,我想删除其他字符并用正确的格式替换值。
有效示例:
123.12
2
56754
92929292929292.12
0.21
3.1
.90
无效的例子:
12.1232
2.23332
e666.76
-1.23
-54.3242
3.98A
56B
BBB.12C
14.23.56
1..45
目前我找到了一个使用以下正则表达式的解决方案:
$("#SomeElement").keyup(function () {
this.value = this.value.replace(/(\.\d\d)\d+|([\d.]*)[^\d.]/, '$1$2')
});
这有两个问题
提前谢谢。
答案 0 :(得分:3)
我现在已经测试了这个并且它可以工作,试一试:
$("#SomeElement").keyup(function () {
this.value = this.value.replace(/([^\d]*)(\d*(\.\d{0,2})?)(.*)/, '$2');
});
答案 1 :(得分:1)
我不会尝试使用一个正则表达式。这样的正则表达肯定会让你做恶梦并导致无数的错误。省去麻烦,特别是如果你是regex的新手。
我会将此任务分解为以下算法:
删除所有不良字符 - 所有不是数字或句点的内容。
找到数字的整数部分(第一个句点之前的所有数字)。
找到数字的小数部分(第一个句点后的所有数字)。
将各个部分放在一起,只有在输入中有句点时才添加小数部分。
我们把它放在代码中:
$("#SomeElement").on('input', function () {
var filtered = this.value.replace(/[^0-9.]/g, '').split('.')
var integer = filtered.shift()
var hasDecimal = filtered.length > 0
var fraction = filtered.join('').slice(0, 2)
this.value = integer + (hasDecimal ? '.' + fraction : '')
});
哦,并绑定到input
事件,而不是keyup
,keypress
或keydown
。他们都有缺点。我可能建议使用this.selectionStart
和this.setSelectionRange()
来保存用户的插入位置,或者如果他们尝试返回编辑部分输入,则会出现一些不稳定的行为。所以这看起来基本上就像:
var caretPos = this.selectionStart
this.value = ...
this.setSelectionRange(caretPos, caretPos)
虽然你可能想稍微修改它以获得你需要的行为。这是JSFiddle中的所有内容。欢呼声。
答案 2 :(得分:0)
答案 3 :(得分:0)
试试这个^\s*(?=.*[1-9])\d*(?:\.\d{1,2})?\s*