javascript - 匹配十进制数字并替换 javascript 中的非数字字符

标签 javascript replace

我在 JavaScript 中使用以下函数。

function chknumber(a) {
    a.value = a.value.replace(/[^0-9.]/g, '', '');
}

此函数替换在我已调用上述函数的 onkeyup 上的 textbox 中输入的任何非数字字符。问题是它也允许这个字符串

1..1

我希望该函数也替换第二个点字符。任何建议都会有帮助。

最佳答案

我不提倡在人们尝试输入字段时简单地修改字段,因为使用这样的简单处理程序很容易干扰他们正在做的事情。 (事后验证,或使用编写良好、经过彻底测试的屏蔽库。)当用户在字段中键入内容时更改字段的值时,您会弄乱插入点的位置,这实际上是/strong> 让用户感到沮丧。但是...

第二次替换可以纠正..等:

function chknumber(a) {
    a.value = a.value.replace(/[^0-9.]/g, '').replace(/\.{2,}/g, '.');
}

将一行中的两个或多个 . 替换为一个。 但是,它仍然允许 1.1.1,而您可能不想要它。遗憾的是,JavaScript 没有lookbehinds,所以我们进入更多逻辑:

function chknumber(a) {
    var str = a.value.replace(/[^0-9.]/g, '').replace(/\.{2,}/g, '.');
    var first, last;
    while ((first = str.indexOf(".")) !== (last = str.lastIndexOf("."))) {
        str = str.substring(0, last) + str.substring(last+1);
    }
    if (str !== a.value) {
        a.value = str;
    }
}

不能保证不存在其他边缘情况等,并且每次您将替换分配给a.value时,您都会弄乱用户的插入点,这令人惊讶地令人沮丧。

所以,是的:事后验证,或者使用编写良好、经过彻底测试的屏蔽库。 (如果您使用 jQuery,我很幸运 this jQuery plugin 。)

<小时/>

旁注:原始替换中的第二个 '' 是不必要的; replace 仅使用两个参数。

关于javascript - 匹配十进制数字并替换 javascript 中的非数字字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42502516/

相关文章:

vbscript - 替换所有空格

javascript - 刷新由 django 模板生成的 <div> 元素

javascript - Next.js 中的动态路由是在服务器端还是在客户端呈现?

javascript - 是否可以使用单个 javascript 标签来加载外部 js 文件并调用其函数?

javascript - 将商店状态作为 Prop 传递,还是每个组件访问全局商店?

MySQL 替换功能

replace - Lisp:多级搜索和替换

javascript - 当 Javascript 仅为特殊视口(viewport)构建时,我如何实现它?

mysql - REPLACE INTO TABLE mysql 查询的替代方案

Python 替换 >20GB 文本文件中的一行