我是否错过了一个标准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()不是我想要的。
当前回答
如果还想处理数字错误,可以使用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"
其他回答
如果你使用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
PS:如果你使用toFixed(0),那么不需要更换。
我认为下面的函数可能接近你想要的。我是为我的一个应用程序写的。它总是以不带后面零的标准符号输出。有些东西你可能不想要,但如果你喜欢,可以删掉。它总是返回至少一个小数(e.x。5 = >“5.0”)。它也被限制为10个小数。把它作为一个指南。
const toDecimalStr(value)=>{
let str=value.toFixed(10).replace(/([0]+)$/,"");
try {
if (str.endsWith(".")) str+='0';
} catch (e) {
str+='0';
}
return str;
}
try catch是因为不是所有东西都支持endsWith,我太懒了。
我写这个正则表达式是为了从包含数字的字符串的开头和结尾删除无关紧要的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)}"`); });
当我有更多的时间时,我想弄清楚如何用一个正则表达式来完成这个任务,而不需要在其中查找。欢迎你在下面的评论中打败我。
如果由于任何原因(比如涉及到金钱浮动)不能使用float,并且已经从表示正确数字的字符串开始,您可以发现这个解决方案很方便。它将表示数字的字符串转换为表示数字的字符串,后面不带零。
function removeTrailingZeroes( strAmount ) {
// remove all trailing zeroes in the decimal part
var strDecSepCd = '.'; // decimal separator
var iDSPosition = strAmount.indexOf( strDecSepCd ); // decimal separator positions
if ( iDSPosition !== -1 ) {
var strDecPart = strAmount.substr( iDSPosition ); // including the decimal separator
var i = strDecPart.length - 1;
for ( ; i >= 0 ; i-- ) {
if ( strDecPart.charAt(i) !== '0') {
break;
}
}
if ( i=== 0 ) {
return strAmount.substring(0, iDSPosition);
} else {
// return INTPART and DS + DECPART including the rightmost significant number
return strAmount.substring(0, iDSPosition) + strDecPart.substring(0,i + 1);
}
}
return strAmount;
}
对于非常小的数,这些解都不适用。http://numeraljs.com/为我解决了这个问题。
parseFloat(0.00000001.toFixed(8));
// 1e-8
numeral(0.00000001).format('0[.][00000000]');
// "0.00000001"