我是否错过了一个标准API调用,该调用从一个数字中移除尾随的不重要的零?

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" 

其他回答

我有一个类似的实例,我想在必要的地方使用. tofixed(),但我不想在它不是时使用填充。所以我最终将parseFloat与toFixed结合使用。

固定无填充

parseFloat(n.toFixed(4));

另一个选项几乎做同样的事情 这个答案可能会帮助你做决定

Number(n.toFixed(4));

toFixed将数字四舍五入/填充为特定的长度,但也将其转换为字符串。将其转换回数字类型不仅可以使数字在算术上更安全地使用,还可以自动删除后面的任何0。例如:

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

因为即使你定义了一个后面带0的数字,它们也会被省略。

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

我写这个正则表达式是为了从包含数字的字符串的开头和结尾删除无关紧要的0、小数和空格:

const rxInsignificant = /^[\s0]+|(?<=\..*)[\s0.]+$|\.0+$|\.$/gm; 设 ary = [ "001.230", "2.", "3.00", "1000", " 0000000000000010000.10000000000000000000000 "]; ary.forEach((str)=> { console.log('“${str}” 变为 “${str.replace(rxInsignificant ,'')}”'); });

不幸的是,Safari仍然不支持2018年的规范,该规范为我们提供了正则表达式的回溯。自07-28-2017以来,此问题一直有一个开放的错误报告。

好消息是,在Firefox和所有Chromium衍生产品中,向后查找功能确实有效。希望Safari能收到更多的要求,并尽快实现这个标准。

与此同时,我写了这个函数来完成同样的任务,而不需要回顾:

function createRemoveInsignificantFunction() { const rxLeadingZeros = /^[\s0]+/; const rxEndingZeros = /[\s0]+$/; function removeInsignificant(str) { str = str.replace(rxLeadingZeros,''); let ary = str.split('.'); if (ary.length > 1) { ary[1] = ary[1].replace(rxEndingZeros,''); if (ary[1].length === 0) { return ary[0]; } else { return ary[0] + '.' + ary[1]; } } return str; } return removeInsignificant; } let removeInsignificant = createRemoveInsignificantFunction(); let ary = [ "001.230", "2.", "3.00", "1000", " 0000000000000010000.10000000000000000000000 "]; ary.forEach((str)=> { console.log(`"${str}" becomes "${removeInsignificant(str)}"`); });

当我有更多的时间时,我想弄清楚如何用一个正则表达式来完成这个任务,而不需要在其中查找。欢迎你在下面的评论中打败我。

我有基本相同的需求,但发现没有内置机制来实现此功能。

除了去掉后面的0之外,我还需要为用户的当前语言环境(即123,456.789)对输出进行四舍五入和格式化。

我在这方面的所有工作都包括在GitHub: https://github.com/dperish/prettyFloat.js上的prettyFloat.js (MIT许可)


使用例子:

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

如果将它转换为字符串,它将不会显示任何尾随零,因为它是作为数字而不是字符串创建的,所以后面的零就不会存储在变量中。

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

如果还想处理数字错误,可以使用Intl。NumberFormat或Number.toLocaleString()

new Intl.NumberFormat().format(0.0100) // "0.01"
new Intl.NumberFormat().format(0.010000000000001) // "0.01"
new Intl.NumberFormat().format(0.009999999999999) // "0.01"
console.log((0.0100).toLocaleString()) // "0.01"
console.log((0.010000000000001).toLocaleString()) // "0.01"
console.log((0.009999999999999).toLocaleString()) // "0.01"