我是否错过了一个标准的API调用,可以将数字末尾无关的零去掉?
var x = 1.234000; // to become 1.234
var y = 1.234001; // stays 1.234001
Number.toFixed()
和Number.toPrecision()
并不完全符合我的需求。
我是否错过了一个标准的API调用,可以将数字末尾无关的零去掉?
var x = 1.234000; // to become 1.234
var y = 1.234001; // stays 1.234001
Number.toFixed()
和Number.toPrecision()
并不完全符合我的需求。
我曾经遇到过类似的情况,想在需要时使用.toFixed()
,但是当不需要填充时就不想要。所以最终我使用parseFloat与toFixed结合使用。
不填充的toFixed
parseFloat(n.toFixed(4));
另一个选项几乎可以做相同的事情
这个答案可能有助于您的决定
Number(n.toFixed(4));
toFixed
方法将数字四舍五入或填充到指定长度,并将其转换为字符串。将其转换回数值类型不仅可以使数字在算术运算中更安全,而且还会自动删除任何尾随的零。例如:
var n = "1.234000";
n = parseFloat(n);
// n is 1.234 and in number form
因为即使你在数字后面加上尾随的零,它们也会被省略。
var n = 1.23000;
// n == 1.23;
parseFloat(n).toFixed(4);
而不是你实际的答案。对不起。 - Leopoldo Sanczyk+(n.toFixed(4))
? - Константин Ван如果将其转换为字符串,它将不会显示任何尾随的零,因为这些零并没有在变量中存储,最初它作为一个数字创建而不是字符串。
var n = 1.245000
var noZeroes = n.toString() // "1.245"
var n = 1.245000000000001
(假设这对用户来说不重要) - augur(1.234001).toString()
仍然会产生"1.234001"的结果。可以使用以下一行代码来解决问题:(new Intl.NumberFormat('en-US', { style: 'decimal', minimumFractionDigits: 2, maximumFractionDigits: 2 })).format(1.234001)
。 - dperish我最初使用了 matti-lyra 和 gary 的答案的组合:
r=(+n).toFixed(4).replace(/\.0+$/,'')
结果:
略有问题的情况是0.10001。我最终使用了这个较长的版本:
r = (+n).toFixed(4);
if (r.match(/\./)) {
r = r.replace(/\.?0+$/, '');
}
r=(+n).toFixed(4).replace(/([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/,'$1')
这将得到与上面相同的结果。
toFixed(4).replace(/([0-9]+(\.[1-9]+)?)(\.?0+$)/,"$1")
。 - Gary([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)
。 - Garyreplace(/[,.][1-9]+(0+)/,'')
? - Sebastian Sebaldreplace(/\.0*$|(\.\d*[1-9])0+$/, '$1')
或者João Costa提供的正则表达式。参见https://regex101.com/r/KmsEFd/1 - geekleytoFixed
方法会在必要时进行适当的四舍五入。它还会添加尾随零,这并不总是理想的。
(4.55555).toFixed(2);
//-> "4.56"
(4).toFixed(2);
//-> "4.00"
如果您将返回值转换为数字,那些末尾的零将被删除。 这比进行自己的四舍五入或截断数学运算更简单。
+(4.55555).toFixed(2);
//-> 4.56
+(4).toFixed(2);
//-> 4
toFixed
调用使它们显著)。 这是一个奇怪的UX边缘情况。 - worc这样就直接乘以1,怎么样?
var x = 1.234000*1; // becomes 1.234
var y = 1.234001*1; // stays as 1.234001
我有基本相同的需求,但发现没有内置机制来实现此功能。
除了修剪尾数零之外,我还需要将输出四舍五入并格式化为用户当前地区的格式(即123,456.789)。
我在GitHub上包含所有这方面的工作,名为prettyFloat.js(MIT许可证):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)
更新 - 2018年8月
所有现代浏览器现在都支持 ECMAScript 国际化 API,它提供了语言敏感的字符串比较、数字格式化以及日期和时间格式化。
const formatters = {
default: new Intl.NumberFormat(),
currency: new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 0, maximumFractionDigits: 0 }),
whole: new Intl.NumberFormat('en-US', { style: 'decimal', minimumFractionDigits: 0, maximumFractionDigits: 0 }),
oneDecimal: new Intl.NumberFormat('en-US', { style: 'decimal', minimumFractionDigits: 1, maximumFractionDigits: 1 }),
twoDecimal: new Intl.NumberFormat('en-US', { style: 'decimal', minimumFractionDigits: 2, maximumFractionDigits: 2 })
};
formatters.twoDecimal.format(1234.5678); // result: "1,234.57"
formatters.currency.format(28761232.291); // result: "$28,761,232"
对于旧版浏览器,您可以使用这个填充程序:https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en
maximumFractionDigits
的限制为20。 - Lonnie Best纯正则表达式答案
n.replace(/(\.[0-9]*[1-9])0+$|\.0*$/,'$1');
我想知道为什么没有人给了一个!
我想知道为什么没有人给了一个!
你可以尝试这个来减小浮点数的大小
var n = 0.0000;
n = parseFloat(n.toString());
//output n = 0;
// n = 3.14000; --> n = 3.14;
如果你使用toFixed(n)
其中n > 0,那么一个更简单、更稳定(不需要浮点数操作)的解决方案是:
(+n).toFixed(2).replace(/(\.0+|0+)$/, '')
// 0 => 0
// 0.1234 => 0.12
// 0.1001 => 0.1
// 1 => 1
// 1.1234 => 1.12
// 1.1001 => 1.1
// 100 => 100
// 100.1234 => 100.12
// 100.1001 => 100.1
备注:如果您使用 toFixed(0)
,则无需使用 replace
。
.replace(/(\.0+|0+)$/, '')
对于 toFixed()
方法的默认值 digits
参数存在缺陷,该参数的默认值为 0。例如,(+'10').toFixed().replace(/(\.0+|0+)$/, '')
或 (+'10').toFixed(0).replace(/(\.0+|0+)$/, '')
返回的结果是 1 而不是 10。 - T.V.toFixed(0)
,则根本不需要进行替换,也不会浪费 CPU。 - shawnif else
来检查 n 是否为 0,以处理 n 不是硬编码的情况。 - T.V.
1.234000 === 1.234
的意思是“1.234000等于1.234”。 - GumboparseFloat(n)
? - Mr. Alien