js 怎样用正则去掉小数点后面多于的0

想用replace替换掉小数点后面多于的0.

例如: 12.000700 ——————> 12.0007

注意:若是没有小数点的话,匹配不生效,不替换任何字符。


[补充内容]

感谢各位老哥的回答。但是可能我对问题的描述不够全面。

1.(不希望转为数字)我的整个数值计算是字符串按位计算的,所以我并不希望将他转为数字,而是通过正则的方式去掉多余的0。不愿意转换也有一点是String/Number等方法对小数点后面的位数有限制。

2.(需要考虑没有小数点的情况)/0*$/或者/0+$/这种单纯的匹配末尾是不全面的。可能有没有小数点的存在。

并不希望: 12000 ——————> 12

这明显改变了数值

3.(目前想到的方法)目前的能想到的用了两个replace一个match。先匹配到小数点右面的字符。再将该字符去末尾0替换到小数点右面。显然不高级,有没有更优雅的写法。

var str = "12.000700";
var _tmp = str.match(/\.\d+0+/)[0].replace(/0+$/,'');
console.log(str.replace(/\.\d+0+/, _tmp));
阅读 16.8k
8 个回答
const arr=['1200.00100','1200.00000','1200.','1200','1200.10000','0.120010000','0.000011111']
const regexp=/(?:\.0*|(\.\d+?)0+)$/
arr.forEach((item)=>{
    console.log(item.replace(regexp,'$1'))
})

// > 1200.001
// > 1200
// > 1200
// > 1200
// > 1200.1
// > 0.12001
// > 0.000011111

再解释下正则的意思(?:\.0*|(\.\d+?)0+)$

先分解成4部分

  1. (?:reg1|reg2) - 它是一个正则分组非捕获组,要么匹配reg1,要么匹配reg2,优先匹配reg1,加上?:不对捕获组记录
  2. \.0* - 表示匹配一个.开头,后边跟着0或0个以上数量的0,且不进行捕获,所以在填充$1时,就是个空值
  3. (\.\d+?)0+ - 它是一个捕获组,匹配一个.开头后边跟着非贪婪(懒惰)匹配任意数字,接着在末尾尽可能多的匹配0这个字符,匹配完成后,生成一个捕获组内容
  4. $ - 表示匹配结果需要以0作为结尾

换个思路行不行?

clipboard.png

既然不换思路,换个代码行不行?

str.replace(/\.\d+0+/, () => str.match(/\.\d+0+/)[0].replace(/0+$/, ''));

Number("12.000700").toString()

var sNum = '12.000700',
s = sNum.replace(/(?:(\.\d*[1-9])0+|\.0*)$/, '$1');
alert(s);

如果是数字的话没必要因为js默认给你去掉了
字符串的话用正则或者转数字

var num = 12.000700;
var str = "12.000700";
console.log(str.replace(/0*$/, "")); //正则
console.log(str - 0); //转为数字 js操作数字应该默认就是去掉数字后面的0所有
console.log(num); //数字默认去掉后面的0

var a = 10.10100;
var b = a + "";
var c = a.replace(/0+$/,"");
var d = parseInt(c);

replace(/0+$/,"")
字符串替换方法. 第一个参数是要替换的char, 第二个是替换成的char.
/0+$/ 是一个正则表达式, $表示从字符串后查找0,+表示一个或多个. 找到了多个0替换成"".

        var str = "12000700";
        var strNew = Number(str);
        console.log(strNew);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏