我有一个函数 formatMoney
将数字转换为千位分隔的字符串,它的工作接近完美。我今天才注意到,只要输入的数字是x.995xxx,它就难以正确取整。它就会四舍五入到0.1000而不是1.0000。
有什么办法可以解决这个问题吗?我从几个星期前的一个SO帖子中复制了下面的函数,但再也找不到了。
n1 = 0.9940
n2 = 0.9950
$('#n1').html(formatMoney(n1, 2))
$('#n2').html(formatMoney(n2, 2))
function formatMoney(n, dp){
var s = ''+(Math.floor(n)), d = n % 1, i = s.length, r = '';
while ( (i -= 3) > 0 ) { r = '.' + s.substr(i, 3) + r; }
return s.substr(0, i + 3) + r +
(d ? ',' + Math.round(d * Math.pow(10, dp || 2)) : '');
};
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body>
<html>
<p> Correct Output: </p>
<div id="n1">0,9900</div>
<p> Current wrong output: </p>
<div id="n2">0,1000</div>
<p> Desired output: </p>
<div>1,0000</div>
</html>
</body>
试试下面的方法。
function formatMoney(n, digits){
var negative = false;
if (digits === undefined) {
digits = 0;
}
if( n < 0) {
negative = true;
n = n * -1;
}
var multiplicator = Math.pow(10, digits);
n = parseFloat((n * multiplicator).toFixed(11));
n = (Math.round(n) / multiplicator).toFixed(digits);
if( negative ) {
n = (n * -1).toFixed(2);
}
//return n;
var mystring = n.toString().replace(/\B(?<!\.\d*)(?=(\d{3})+(?!\d))/g, ",");
mystring = mystring.replace(/[,.]/g, m => (m === ',' ? '.' : ','))
return mystring;
};
你想要这样的东西(更新为小数点和甚至负数)?
function milesIt(num, n = 2) {
let decimalPoint = num.toString().indexOf("."), isNegative = num < 0 && (num *= -1);
return (isNegative && "-" || "") + Math.floor(num).toString().split("").reverse().map((n, i, a) =>
(i + 1) % 3 === 0 && i + 1 != a.length && "." + n || n).reverse().join("") +
(decimalPoint !== -1 && "," + num.toString().slice(decimalPoint + 1, decimalPoint + n + 1) || "");
}
let cash = -1.20389474323;
//defualt round up to 2
for(let i = 1;i < 5; i++) {
console.log(milesIt(cash *= -10));
}