我想要一个函数来截断String中一个数字的所有零,一个String可以大于JavaScript的浮点数,这意味着parseFloat 不是一个选项。
当我定义truncate时,我的意思是删除所有可能不必要的零并添加所有可能的必要零,并且还要处理十进制情况,例如:
01 -> 1
.04 -> 0.04
.30 -> 0.3
10 -> 10
0.0 -> 0
23. -> 23
00 -> 0
24.560 -> 24.56
我非常喜欢RegExp,有多个替换版以便于理解。
你的答案之后
答案 0 :(得分:4)
只需将其强制转换为带加号的数字,因为您真正想要的是在javascript中将字符串转换为有效数字
+"00.020" // 0.02
+"02.032010" // 2.03201
或使用parseFloat
,Number()
或执行相同操作的任何其他方法
答案 1 :(得分:1)
正则表达式解决方案:
(0+str).replace(/^0+(?=\d)|\.0*$|(\.\d*?)0+$/g, '$1');
基本上,我们在开头添加一个零以避免尾随点,然后我们删除零:
^0+(?=\d)
在开头删除了零。\.0*$
删除一个点,后跟零,直到结束。(\.\d*?)0+$
只有在点之后才会删除零。答案 2 :(得分:0)
只需使用parseFloat
> parseFloat("02.032010")
2.03201
> parseFloat("00.020")
0.02
>
答案 3 :(得分:-1)
myDecimalString.replace(/(?:(\.\d+?)0+|\.0*)([Ee][+\-]?\d+)?$/, '$1$2')
应该假设一个大致匹配JavaScript's numerical literal format的字符串。
(\.\d*?)0+
组$1
中捕获任何小数点和任何不参与尾随零的数字运行。
|\.0*
处理有小数后跟但没有数字的情况。
([Ee]...)
捕获组$2
中的任何指数。
替换$1$2
保留了分数的有用部分,后跟任何指数。
留下.0
截断为空字符串的情况。我们可以通过另一个替换来解决这个问题,并很好地格式化".5"
之类的输入:
.replace(/^([+\-])?([.eE]|$)/, '$010$02')
使用$01
来保留任何起始符号,使用$02
来保留整数组件之后发生的任何内容,而在没有整数部分时插入0
。
var strs = ['10', '10.0', '0.5', '0.50', '0.500', '1.0e6', '123', '.7', '.2', '.0'];
function trunc(myDecimalString) {
return myDecimalString
.replace(
/(?:(\.\d+?)0+|\.0*)([Ee][+\-]?\d+)?$/, '$1$2')
.replace(/^([+\-])?([.eE]|$)/, '$010$02');
}
for (var i = 0; i < strs.length; ++i) {
console.log('%s -> %s', strs[i], trunc(strs[i]));
}
演示了它的行动和日志:
10 -> 10
10.0 -> 10
0.5 -> 0.5
0.50 -> 0.5
0.500 -> 0.5
1.0e6 -> 1e6
123 -> 123
.7 -> 0.7
.2 -> 0.2
.0 -> 0
对于非机器生成的数字,这将失败,其中.
用于1.000.000
,如{{1}}为100万。
答案 4 :(得分:-1)
var a = parseInt("00.020" , 10);