使用 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.0000000000e12
和 1.0000000000e+12
之间没有区别。以任何一种格式指定的数字表示相同的含义,一旦被解释器解析,就无法恢复 +
是否最初指定。所以我想你是从某个地方得到这些数字作为字符串,在那里可以检测到+
的存在或不存在?如果是这种情况,您可以检查输入是否存在+
,如果不存在,则将其从Number.toExponential
的结果中删除。
要处理994.44
的情况,您可以设置检查以仅将Number.toExponential
应用于超过特定阈值的数字;或者,如果数字以字符串形式出现,您可以检测指数是否存在,如果不存在,则跳过对 Number.toExponential
的调用。
【讨论】:
以上是关于使用 RegEx 删除指数数字的尾随零的主要内容,如果未能解决你的问题,请参考以下文章