从数字中删除不重要的尾随零?

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

防爆。

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

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

如果将它转换为一个string,它将不会显示任何尾随的零,它们不是以variablesforms存储在variables中,而是作为一个数字创build的,而不是string。

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

我有一个类似的例子,我想在必要时使用.toFixed() ,但是当它不是的时候,我不想填充。 所以我结束了与toFixed一起使用parseFloat。

固定没有填充

 parseFloat(n.toFixed(4)); 

另一个select,几乎相同的事情
这个答案可能有助于你的决定

 Number(n.toFixed(4)); 

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

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

因为即使你定义了一个尾随零的数字,它们也会被丢弃。

 var n = 1.23000; // n == 1.23; 

我首先使用了matti-lyra和gary的答案组合:

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

结果:

  • 1234870.98762341:“1234870.9876”
  • 1230009100:“1230009100”
  • 0.0012234:“0.0012”
  • 0.1200234:“0.12”
  • 0.000001231:“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.000001231:“0”
  • 0.10001:“0.1”
  • “asdf”:“NaN”(所以没有运行时错误)

更新 :这是加里的新版本(见评论):

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

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

toFixed方法将根据需要进行相应的舍入。 它也会添加尾随零,这并不总是理想的。

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

如果您将返回值转换为数字,那些尾随的零将被删除。 这是比自己舍入或截断math更简单的方法。

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

我有基本相同的要求,并发现没有这种function的内置机制。

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

我在这方面的所有工作已经在GitHub上被列为prettyFloat.js(MIT Licensed): 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) 

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

使用parseFloat不是我的select,因为它可能不会返回完全相同的值。 toFixed是不是一个选项,因为我不想任何东西,所以我创build了一个函数:

 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; } 

这是一个可能的解决scheme:

 var x = 1.234000 // to become 1.234; var y = 1.234001; // stays 1.234001 eval(x) --> 1.234 eval(y) --> 1.234001 

这些解决scheme都不适用于我非常小的数字。 http://numeraljs.com/解决这个给我。

 parseFloat(0.00000001.toFixed(8)); // 1e-8 numeral(0.00000001).format('0[.][00000000]'); // "0.00000001"