关于输入框输入2位小数的问题

obj.value = obj.value.replace(/[^\d.]/g, ""); //清除"数字"和"."以外的字符
obj.value = obj.value.replace(/^\./g, ""); //验证第一个字符是数字
obj.value = obj.value.replace(/\.{2,}/g, "."); //只保留第一个, 清除多余的
obj.value = obj.value.replace(".", "$#$").replace(/\./g, "").replace("$#$", ".");
obj.value = obj.value.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); //只能输入两个小数

这样的代码我找了很多类似的,但是都会出现下面的问题:
image.png
请大神支招

阅读 3.3k
5 个回答
obj.value = obj.value.replace(/^((-)?(\d+\.\d{2}).*|.*)$/, '$2$3')

试试

parseFloat(number.toFixed(2));

或者

<input type="number" step="0.01">
this.num=Math.floor(this.num * 100) / 100;//保留两位小数,不四舍五入
this.num = this.num.toFixed(2)//保留两位小数,四舍五入

这个规则其实还是比较复杂的

  1. 只包括数字字符和小数点
  2. 最多有1个小数点
  3. 如果有小数点,则小数点后最多紧跟2个数字字符
  4. 小数点前可以有多位数字字符
  5. 除非后面紧跟小数点,否则首字符不能为0
  6. 小数点不能独立存在

这个判断不一定只能是一句规则式,其实可以多个判例一起用。

有一个近似简化的规则式/^\d+(\.\d{0,2})?$/,不过它不能保证上面的第5条规则

对于字符串替换处理,其实有一个取巧的方法:
在保证了只有小数点和数字等其他规则后,可以先用小数点把字符分成多个子字符串,
比如你的

iO="1.4444.2222.222";
iA=iO.split(".",2);
iN=iA.join(".");
// 这样处理后,肯定最多只有一个小数点
// 至于保留2位小数,因为没有具体规则,所以不好具体实现

此外如果这个数是输入的,其实在输入过程中就依次处理,基本可以保证不能输入这样的情况,但粘贴的可能还是出现,所以要最终处理

重新赋值会导致光标位置异常的问题,尤其是删除其中某个字符的时候,不太好控制。
最好的是方式是 两个inpit框做整数类型处理,中间加个外置小数点。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题