使用RegEx删除指数的尾随零



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

例如:

  • 1.0000000000e+12应该得到:1e+12
  • 1.0000000000e12应该产生:1e12
  • 1.0000000000e-12应该产生:1e-12
  • 1.200000000e +12应该得到:1.12e+12
  • 994.44应该产生:994.44

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

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

对不起,它不能消除小数点,因为它后面可以有有效的数字。

参见RegEx Demo

更新

如果你还想删除点,你可以使用下一个regexp和模式替换:

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 />');

使用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的调用。