使用 RegEx 删除指数数字的尾随零

Posted

技术标签:

【中文标题】使用 RegEx 删除指数数字的尾随零【英文标题】:Remove trailing zeros for exponential numbers using RegEx 【发布时间】:2015-09-08 21:19:42 【问题描述】:

使用正则表达式,如何删除 1.0000000000e+12 的尾随零?

例如:

1.0000000000e+12 应该是:1e+12 1.0000000000e12 的结果应该是:1e12 1.0000000000e-12 应该是:1e-12 1.1200000000e+12 应该是:1.12e+12 994.44 应该是:994.44

【问题讨论】:

那些不是前导零,而是尾随零。 【参考方案1】:

这是一个有点困难的问题,因为您必须确保数字中有一个小数点才能仅消除其中不重要的零(零在小数点的左侧是重要的)。您还必须保留小数点 后的有效数字,并仅消除最后的零。此外,并非所有浮点数都以基指数因子终止,这是我的方法:

str.replace(/\.([0-9]*[1-9])?0*/g, ".$1");

抱歉,它不会消除小数点,因为它后面可以有有效数字。

见RegEx Demo

更新

如果您还想删除可选的点,您可以使用下一个正则表达式和模式替换:

str.replace(/(\.[0-9]*[1-9])0*|(\.0*)/, "$1");

见Regexp Demo

function removeZeroes(number) 
  return number.replace(/(\.[0-9]*[1-9])0*|(\.0*)/, "$1");


document.write(removeZeroes('1.000000000e12') + '<br />');
document.write(removeZeroes('1.000000000e-12') + '<br />');
document.write(removeZeroes('1.000000000E-12') + '<br />');
document.write(removeZeroes('1.001200000e-12') + '<br />');
document.write(removeZeroes('1.120000000e+12') + '<br />');
document.write(removeZeroes('10.120000000e+12') + '<br />');
document.write(removeZeroes('10e12') + '<br />');
document.write(removeZeroes('994.44') + '<br />');
document.write(removeZeroes('994.4400000000') + '<br />');
document.write(removeZeroes('100000000.000') + '<br />');
document.write(removeZeroes('10000000.0') + '<br />');
document.write(removeZeroes('123.00000001230000') + '<br />');

【讨论】:

@anubhava,谢谢。我想你没有看到它,就像你的评论一样。感谢您的支持。 @LuisColorado:希望你不介意......我在你的解决方案中添加了一个代码 sn-p,提供了我和你的测试用例的组合。您的解决方案似乎通过了所有测试。做得好! +1 很好,但它并没有给解决方案增加太多,因为它已经通过正则表达式演示进行了演示。【参考方案2】:

使用Number.toExponential

您可以指定小数点后的位数,但如果省略,则默认为指定位数所需的位数。

你说你想要的唯一不做的事情是 (1) 将始终在指数前放置一个 +,并且 (2) 不适用于你不想成为指数的数字格式。

INPUT            OUTPUT
1.0000000000e+12 1e+12
1.0000000000e12  1e+12
1.0000000000e-12 1e-12
1.1200000000e+12 1.12e+12
994.44           9.9444e+2

为了更贴近您的需求,您可以编写一个小包装器。

当您说您希望 1.0000000000e12 变为 1e12 时,我假设您意识到在 JS 中符号 1.0000000000e121.0000000000e+12 之间没有区别。以任何一种格式指定的数字表示相同的含义,一旦被解释器解析,就无法恢复 + 是否最初指定。所以我想你是从某个地方得到这些数字作为字符串,在那里可以检测到+ 的存在或不存在?如果是这种情况,您可以检查输入是否存在+,如果不存在,则将其从Number.toExponential 的结果中删除。

要处理994.44 的情况,您可以设置检查以仅将Number.toExponential 应用于超过特定阈值的数字;或者,如果数字以字符串形式出现,您可以检测指数是否存在,如果不存在,则跳过对 Number.toExponential 的调用。

【讨论】:

以上是关于使用 RegEx 删除指数数字的尾随零的主要内容,如果未能解决你的问题,请参考以下文章

第九十四章 SQL函数 %MINUS

删除前导零和尾随零并将结果保留到小数点后两位

如何从sqlplus中的数字列中删除小数点后的尾随零?

我如何确保十进制中有一定数量的数字(尾随零)

使用 NSNumberFormatter 生成小数点后尾随零的数字

删除小数点雪花后的尾随零