用于带一个点和2个小数点的正数的JavaScript正则表达式

用于带一个点和2个小数点的正数的JavaScript正则表达式,javascript,regex,numbers,decimal,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 无效示例: 123.12 2

我对正则表达式很陌生,我对正则表达式有一个问题

我想只允许用户输入正数,带或不带一个点,最多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
无效示例:

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')
});
这有两个问题

  • 它允许我输入多个点。(例如123.89.80)
  • 即使我输入一次字母“a”,它会过滤,但如果我按住键盘上的字母“a”,它仍然允许输入(例如AAA12),可能是因为“按键”事件

  • 提前谢谢。

    我现在已经测试过了,它可以工作了,试一试:

    $("#SomeElement").keyup(function () {
        this.value = this.value.replace(/([^\d]*)(\d*(\.\d{0,2})?)(.*)/, '$2');
    });
    
    尝试使用以下正则表达式:


    请参见

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

    我不会尝试使用一个正则表达式执行此操作。这样的正则表达式肯定会让你做噩梦,并导致数不清的bug。省省你自己的麻烦,特别是如果你是新的正则表达式

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

  • 删除所有不好的字符——所有不是数字或句点的字符

  • 查找数字的整数部分(第一个句点之前的所有数字)

  • 查找数字的小数部分(第一个句点后的所有数字)

  • 将这些片段放在一起,如果输入中有一个句点,则只添加小数部分

  • 让我们把它写进代码:

    $("#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 : '')
    });
    
    哦,并绑定到
    输入
    事件,而不是
    按键
    按键
    按键
    。它们都有缺点。我可能会建议使用
    this.selectionStart
    this.setSelectionRange()
    保存用户的插入符号位置,或者如果他们试图返回编辑部分输入,就会出现一些不稳定的行为。这看起来基本上是这样的:

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

    尽管您可能希望对其进行一些修改,以获得所需的行为。这是一个完整的例子。干杯。

    对于第一个问题,请参考一个解决方案\d*\。\d{1,2}$\d*(?=\)$一个点和两个小数。-为什么
    3.1
    应该有效@RomanPerekhrest嗯,如果用户不能输入第一个小数点,那么他们很难输入第二个小数点。“我认为这种情况是不言而喻的。”罗曼佩雷克勒斯我的意思是小数点后2位。用户可以键入1个十进制数或2个十进制数。$(“#TextboxElement”).keyup(函数(){this.value=this.value.replace(/^\s*(?=.[1-9])\d*(?:\。\d{1,2})?\s*/,'';});我试着这样做,但还是不行。谢谢你的正则表达式。但我想做的是用正确的格式替换错误的格式。类似于$(“#TextboxElement”).keyup(函数(){this.value=this.value.replace(/^\?(?!-)\d+(?:\。\d{1,2})$/,'';});但如果我只是那样做是行不通的。有什么主意吗?我已经修好了,再试一次非常感谢!!这正是我想要的!!很高兴我能帮忙