JavaScript-以所有可能的方式截断字符串中的数字

JavaScript-以所有可能的方式截断字符串中的数字,javascript,regex,string,Javascript,Regex,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,有多个r

我想要一个函数来截断字符串中数字的所有零,字符串中的数字可以大于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,有多个replace以便于理解

此编辑是在您的答案之后进行的,但为了避免混淆,这是一个更详细的版本。

myDecimalString.replace(/(?:(\.\d+?)0+|\.0*)([Ee][+\-]?\d+)?$/, '$1$2')
假设字符串大致匹配,则应该这样做

(\.\d*)0+
在组
$1
中捕获任何小数点和任何不参与尾随零运行的数字运行

\.0*
处理有尾随小数点但没有数字的情况

([Ee]…)
捕获组
$2
中的任何指数

替换
$1$2
保留分数的有用部分,后跟任何指数

这就留下了
.0
截断为空字符串的情况。我们可以通过另一个替换来很好地解决该问题并格式化输入,如
“.5”

.replace(/^([+\-])?([.eE]|$)/, '$010$02')
它使用
$01
保留任何起始符号,
$02
在没有整数部分时插入
0
时保留整数部分后出现的任何内容



警告 对于非机器生成的数字,如果使用
1.000.000
转换为100万,则此操作将失败

var a = parseInt("00.020" , 10);

从这里开始:

只需将其强制为带加号的数字,因为您真正需要的是在javascript中将字符串转换为有效数字

+"00.020" // 0.02

+"02.032010" // 2.03201
或者使用
parseFloat
Number()
或任何其他执行相同操作的方法

只要使用


正则表达式解决方案:

(0+str).replace(/^0+(?=\d)|\.0*$|(\.\d*?)0+$/g, '$1');
基本上,我们在开头添加一个零以避免拖尾点,然后删除零:

  • ^0+(?=\d)
    删除开头的零
  • \.0*$
    删除一个后跟零的点,直到结束
  • (\。\d*?)0+$
    仅当零位于点之后时,才删除末尾的零


如果需要字符串,请将字符串转换为数字,然后再转换回字符串。
(+“02.032010”).toString()
@OP:您真的应该接受另一个答案。您已经接受了最糟糕的解决方案。为什么您真的关心?为什么您倾向于使用正则表达式?始终指定基数<代码>parseInt(“…”,10)这将破坏小数。请不要参考W3Schools,因为它们与决定web工具标准的任何团体都没有任何关系,而且它们是。相反,具有高质量的文档,或者(对于JavaScript),您可以使用。@Murplyx上的.进一步读取-JavaScript使用的浮点52位尾数仅支持2^53,即9007199254740992,这是可用的最高数字。如果你需要比这个大的数字,你会遇到几乎所有的问题,你应该把数字分解并进行逐位计算,不要在字符串上使用正则表达式,因为这将永远不会解决任何问题,也不会引起更多的问题。顺便说一下,这已经解决了,不需要再解决了,这是一个实现->我自己已经有了减法、加法和乘法nty@Murplyx-我的答案仍然有效,但在您现在的示例中,
无效,它不是一个数字,因此它将返回
NaN
(它应该返回),而不是零。要避免使用
|0
(或NULL),请参阅fiddle->。对于大于2^53的数字,没有很好的处理方法,正如我之前所说的,我建议使用一个可以处理大数字的库,而不仅仅是将它们当作字符串。为什么可以通过原生JS方法来完成的事情如此复杂呢?不,请不要正则表达式。非常好,因为我正在制作一个包含大量数字的数学库,所以解析不是一个选项,但您是否也可以使其设置为“.02”到“0.02”和“.0”到“0”?@Murplyx“所以解析不是一个选项”-这是什么意思?字符串处理和操作正在解析,这正是您要做的。@RPM,继续并提供一个答案,该答案使用本机JS函数,不会导致无法准确表示的输入数据丢失,因为IEEE-754加倍,我将对此进行投票。编辑问题我的问题,如果您现在可以回答,我会接受你的回答。我的解决方案!您知道任何
parseFloat
不起作用的示例吗?让我知道。我也希望它恢复为字符串,但是使用toString()很容易,现在问题是:使用
.toFixed
而不是toString。但是如果数字的数目正确,那么你的答案是错误的。你能修正23吗23和.04->0.04也在正则表达式中?
+"00.020" // 0.02

+"02.032010" // 2.03201
> parseFloat("02.032010")
2.03201
> parseFloat("00.020")
0.02
> 
(0+str).replace(/^0+(?=\d)|\.0*$|(\.\d*?)0+$/g, '$1');