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

Posted

技术标签:

【中文标题】JavaScript 正则表达式,用于带有一个点和 2 个小数的正数【英文标题】:JavaScript Regex for positive numbers with one dot and 2 decimal 【发布时间】:2017-07-21 20:22:36 【问题描述】:

我对正则表达式很陌生,但我对正则表达式有疑问。

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

这有两个问题

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

提前谢谢你。

【问题讨论】:

第一个问题参考***.com/questions/308122/… 解决方案的一个想法\d*\.\d1,2$|\d*(?=\.)$ 一个点和两个小数。 - 为什么3.1 应该有效?! @RomanPerekhrest 嗯,如果不能输入第一个小数,用户几乎无法输入第二个小数。我认为这种情况是不言而喻的。 @RomanPerekhrest 我的意思是最多 2 位小数。用户可以输入 1 位小数或 2 位小数。 【参考方案1】:

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

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

【讨论】:

我已经修好了,再试一次 非常感谢!!这正是我想要的! 很高兴我能帮上忙【参考方案2】:

我不会尝试用一个正则表达式来做到这一点。这样的正则表达式肯定会给你带来噩梦并导致无数的错误。为自己省去麻烦,特别是如果您是正则表达式的新手。

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

    删除所有坏字符——所有不是数字或句点的字符。

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

    找出数字的小数部分(第一个句点之后的所有数字)。

    将各个部分放在一起,如果输入中有句点,则仅添加小数部分。

让我们把它放在代码中:

$("#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 中的所有内容。干杯。

【讨论】:

【参考方案3】:

尝试使用以下正则表达式

^\.?(?!-)\d+(?:\.\d1,2)?$

regex demo / explanation

【讨论】:

感谢您的正则表达式。但我想做的是用正确的格式替换错误的。像 $("#TextboxElement").keyup(function () this.value = this.value.replace(/^\.?(?!-)\d+(?:\.\d1,2 )?$/, ''); );但如果我只是这样做,它就行不通。有什么想法吗?【参考方案4】:

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

【讨论】:

$("#TextboxElement").keyup(function () this.value = this.value.replace(/^\s*(?=.*[1-9])\d *(?:\.\d1,2)?\s*/, ''); );我尝试这样但仍然无法正常工作。

以上是关于JavaScript 正则表达式,用于带有一个点和 2 个小数的正数的主要内容,如果未能解决你的问题,请参考以下文章

带有 unicode 和标点符号的 Javascript 正则表达式

带有\b和国际字符的Javascript正则表达式问题

Bash 中带有字符、点和数字的正则表达式

带有 jQ​​uery 的 Javascript 正则表达式包含正则表达式扩展

只有数字、点和最小值的正则表达式

当正则表达式有效且在其他地方工作时,带有“m”标志的 Javascript 正则表达式错误、“无效的正则表达式组”