带有一个点和两个十进制

时间:2017-03-02 08:04:37

标签: javascript regex numbers decimal

我对正则表达式很新,我对正则表达式有问题。

我想只允许用户输入正数,有或没有一个点,最多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')
});

这有两个问题

  1. 它允许我输入多个点。 (例如123.89.80)
  2. 即使我输入字母“a”一次,也会过滤,但如果我按下键盘中的字母“a”,它仍然允许输入(例如AAAAAAAAA12),也许是因为“keyup”事件?
  3. 提前谢谢。

4 个答案:

答案 0 :(得分:3)

我现在已经测试了这个并且它可以工作,试一试:

$("#SomeElement").keyup(function () {
    this.value = this.value.replace(/([^\d]*)(\d*(\.\d{0,2})?)(.*)/, '$2');
});

答案 1 :(得分:1)

我不会尝试使用一个正则表达式。这样的正则表达肯定会让你做恶梦并导致无数的错误。省去麻烦,特别是如果你是regex的新手。

我会将此任务分解为以下算法:

  1. 删除所有不良字符 - 所有不是数字或句点的内容。

  2. 找到数字的整数部分(第一个句点之前的所有数字)。

  3. 找到数字的小数部分(第一个句点后的所有数字)。

  4. 将各个部分放在一起,只有在输入中有句点时才添加小数部分。

  5. 我们把它放在代码中:

    $("#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事件,而不是keyupkeypresskeydown。他们都有缺点。我可能建议使用this.selectionStartthis.setSelectionRange()来保存用户的插入位置,或者如果他们尝试返回编辑部分输入,则会出现一些不稳定的行为。所以这看起来基本上就像:

    var caretPos = this.selectionStart
    this.value = ...
    this.setSelectionRange(caretPos, caretPos)
    

    虽然你可能想稍微修改它以获得你需要的行为。这是JSFiddle中的所有内容。欢呼声。

答案 2 :(得分:0)

尝试使用以下正则表达式

^\.?(?!-)\d+(?:\.\d{1,2})?$

参见 regex demo / explanation

答案 3 :(得分:0)

试试这个^\s*(?=.*[1-9])\d*(?:\.\d{1,2})?\s*