从数字中删除无用的尾随零?
我错过了一个标准的API调用,从数字中删除尾部无关紧要的零吗?从数字中删除无用的尾随零?
Ex。
var x = 1.234000 // to become 1.234;
var y = 1.234001; // stays 1.234001
Number.toFixed()和Number.toPrecision()不是我所期待的。
如果将其转换为字符串,它将不会显示任何尾随零,这些尾随零并没有存储在变量中,因为它是作为数字创建的,而不是字符串。
var n = 1.245000
var noZeroes = n.toString() // "1.245"
我正要发布一些代码去除零,但Daniel的解决方案似乎工作。它甚至适用于诸如“1.2345000”之类的字符串。 (“1.2345000”* 1).toString(); //变为1.2345 – Steven 2010-08-31 21:18:15
当然,如果你的var已经是一个字符串,你必须先将它转换为数字,然后再返回 – derekcohen 2011-06-27 13:03:38
这很好。我遇到了同样的问题,将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;
请注意,只有在相关的小数位数等于或大于toFixed参数时,它才起作用。如果数字是例如1.200000,toFixed(3)的结果将是1.200,因此不会删除所有的尾随零。 – 2015-11-16 23:37:40
@LeopoldoSanczyk不,这只有在你使用toFixed时才是真的,因为它返回一个字符串。数字类型自动丢失尾随零。这就是为什么我使用这两个串联。 – Gary 2015-11-20 02:51:39
@加里,我撤回了我的评论,我已经看到'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')
这给出了与上述相同的结果。
我有基本相同的需求,并发现有这个功能,没有内置的机制。
除了修剪尾部零之外,我还需要对用户当前的语言环境(即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)
好!我喜欢它也有测试:) – 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"
它不能处理超过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.00000。 一个更好的选择是确定有多少尾随零,然后一次完成切片。确定一个字符是多么高效,分割字符串就不那么简单了。 – 2018-01-26 14:24:07
嗯,'1.234000 === 1.234'。 – Gumbo 2010-08-31 20:10:22
是的,如果你确实警告(x)它弹出没有尾随零 – JKirchartz 2010-08-31 20:17:51
与许多客户端工作后,我可以证明,即使1.234000 === 1.234,客户不希望看到这些额外的零,如果他们不需要。 – contactmatt 2013-01-15 16:44:48