从数字中删除无用的尾随零?

问题描述:

我错过了一个标准的API调用,从数字中删除尾部无关紧要的零吗?从数字中删除无用的尾随零?

Ex。

var x = 1.234000 // to become 1.234; 
var y = 1.234001; // stays 1.234001 

Number.toFixed()和Number.toPrecision()不是我所期待的。

+5

嗯,'1.234000 === 1.234'。 – Gumbo 2010-08-31 20:10:22

+5

是的,如果你确实警告(x)它弹出没有尾随零 – JKirchartz 2010-08-31 20:17:51

+26

与许多客户端工作后,我可以证明,即使1.234000 === 1.234,客户不希望看到这些额外的零,如果他们不需要。 – contactmatt 2013-01-15 16:44:48

如果将其转换为字符串,它将不会显示任何尾随零,这些尾随零并没有存储在变量中,因为它是作为数字创建的,而不是字符串。

var n = 1.245000 
var noZeroes = n.toString() // "1.245" 
+4

我正要发布一些代码去除零,但Daniel的解决方案似乎工作。它甚至适用于诸如“1.2345000”之类的字符串。 (“1.2345000”* 1).toString(); //变为1.2345 – Steven 2010-08-31 21:18:15

+6

当然,如果你的var已经是一个字符串,你必须先将它转换为数字,然后再返回 – derekcohen 2011-06-27 13:03:38

+0

这很好。我遇到了同样的问题,将float转换为字符串,然后使用parseFloat将其恢复为正确的格式,但没有尾随零。 – 2016-08-26 21:08:04

我有一个类似的实例,其中我想用.toFixed()必要的,但我不想填充时,事实并非如此。所以我最终将parseFloat和toFixed一起使用。

toFixed没有填充

parseFloat(n.toFixed(4)); 

,做几乎同样的事情的另一个选项
This answer may help your decision

Number(n.toFixed(4)); 

toFixed会将数字截断/填充到特定的长度,但也会将其转换为字符串。将其转换回数字类型不仅会使数字更安全地使用数字,而且还会自动删除任何尾随0。例如:

var n = "1.234000"; 
    n = parseFloat(n); 
// n is 1.234 and in number form 

因为即使你定义一个尾随零一些他们正在下降。

var n = 1.23000; 
// n == 1.23; 
+0

请注意,只有在相关的小数位数等于或大于toFixed参数时,它才起作用。如果数字是例如1.200000,toFixed(3)的结果将是1.200,因此不会删除所有的尾随零。 – 2015-11-16 23:37:40

+0

@LeopoldoSanczyk不,这只有在你使用toFixed时才是真的,因为它返回一个字符串。数字类型自动丢失尾随零。这就是为什么我使用这两个串联。 – Gary 2015-11-20 02:51:39

+0

@加里,我撤回了我的评论,我已经看到'parseFloat(n).toFixed(4);'而不是你的实际答案。对不起。 – 2015-11-20 05:58:47

我第一次使用马蒂 - 莱拉的组合和Gary的回答:

r=(+n).toFixed(4).replace(/\.0+$/,'') 

结果:

  • 1234870.98762341: “1234870.9876”
  • 1230009100: “1230009100”
  • 0.0012234:“0.0012”
  • 0.1200234: “0.12”
  • 0.0000: “0”
  • 0.10001: “0.1000”
  • “ASDF”: “的NaN”(因此没有运行时错误)

的有点问题的情况下是0.10001 。最后我用这个更长的版本:

r = (+n).toFixed(4); 
    if (r.match(/\./)) { 
     r = r.replace(/\.?0+$/, ''); 
    } 
  • 1234870.98762341:“1234870。9876"
  • 1230009100: “1230009100”
  • 0.0012234: “0.0012”
  • 0.1200234: “0.12”
  • 0.0000: “0”
  • 0.10001: “0.1”
  • “ASDF”:“ NAN”(所以没有运行时错误)

更新:这是加里的新版本(见注释):

r=(+n).toFixed(4).replace(/([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/,'$1') 

这给出了与上述相同的结果。

+0

我有一个纯正则表达式的解决方案,我相信''toFixed(4).replace(/([0-9] +(\。[1-9] +)?)(\。?0 + $)/ ,“$ 1”)' – Gary 2014-07-02 12:04:37

+0

@gary,这不适用于1.0100,但它很接近。 – w00t 2014-07-02 12:43:21

+0

@Gary更近了,现在失败了1.01010 :-) – w00t 2014-07-03 13:12:39

这里是一个可能的解决方案:

var x = 1.234000 // to become 1.234; 
var y = 1.234001; // stays 1.234001 

eval(x) --> 1.234 
eval(y) --> 1.234001 
+2

你不需要评估这个简单的任务! 'parseFloat()'将会非常合适。 – hutchbat 2014-06-23 23:35:12

+1

eval ==邪恶。不要使用它 – eagor 2016-12-02 11:50:31

我有基本相同的需求,并发现有这个功能,没有内置的机制。

除了修剪尾部零之外,我还需要对用户当前的语言环境(即123,456.789)进行四舍五入和格式化输出。

所有我对这个工作的,已列为prettyFloat.js(MIT许可)在GitHub上:https://github.com/dperish/prettyFloat.js


应用实例:

prettyFloat(1.111001, 3) // "1.111" 
prettyFloat(1.111001, 4) // "1.111" 
prettyFloat(1.1111001, 5) // "1.1111" 
prettyFloat(1234.5678, 2) // "1234.57" 
prettyFloat(1234.5678, 2, true) // "1,234.57" (en-us) 
+0

好!我喜欢它也有测试:) – w00t 2014-09-22 21:50:57

toFixed方法将做相应的四舍五入如有必要。它也会添加尾随零,这并不总是理想的。

(4.55555).toFixed(2); 
//-> "4.56" 

(4).toFixed(2); 
//-> "4.00" 

如果您将返回值转换为数字,那些尾随零将被丢弃。这比做自己的四舍五入或截断数学更简单。

+(4.55555).toFixed(2); 
//-> 4.56 

+(4).toFixed(2); 
//-> 4 

这些解决方案都不适用于我非常小的数字。 http://numeraljs.com/为我解决了这个问题。

parseFloat(0.00000001.toFixed(8)); 
// 1e-8 

numeral(0.00000001).format('0[.][00000000]'); 
// "0.00000001" 
+0

它不能处理超过6精度。我想说这个图书馆是无用的,如果它是为了小数字。绝对不推荐。 – 2017-12-21 11:33:28

当Django在文本字段中显示Decimal类型值时,我也需要解决这个问题。例如。当'1'是价值。它会显示'1.00000000'。如果“1.23”是价值,它会显示“1.23000000”(在8“decimal_places”设置的情况下)

使用parseFloat不是我的选择,因为它可能不会返回完全相同的价值。 toFixed不是一种选择,因为我不想圆东西,所以我创建了一个功能:

function removeTrailingZeros(value) { 
    value = value.toString(); 

    # if not containing a dot, we do not need to do anything 
    if (value.indexOf('.') === -1) { 
     return value; 
    } 

    # as long as the last character is a 0 or a dot, remove it 
    while((value.slice(-1) === '0' || value.slice(-1) === '.') && value.indexOf('.') !== -1) { 
     value = value.substr(0, value.length - 1); 
    } 
    return value; 
} 
+0

这有效,但效率很低,因为它会导致每次执行时创建多个字符串。想象一下,在表格中的所有单元格上运行这个函数,其中好的数字是0.00000。 一个更好的选择是确定有多少尾随零,然后一次完成切片。确定一个字符是多么高效,分割字符串就不那么简单了。 – 2018-01-26 14:24:07