将数字格式化为始终显示两位小数

1225

我想要将数字格式化为始终显示两位小数,必要时要四舍五入。

例如:

number     display
------     -------
1          1.00
1.341      1.34
1.345      1.35

我一直在使用这个:

parseFloat(num).toFixed(2);

但它显示的是1,而不是1.00


2
我指的是如果我输入1,它不会显示为1.00,但是如果我输入1.345,则会显示为1.35。 - Varada
1
我已经重新表述了你的问题,以符合你所寻找的内容。请检查以确保我正确理解了你的意思。 - drudge
精确舍入,支持IE。https://gist.github.com/ArminVieweg/28647e735aa6efaba401 - TarranJones
可能是将数字格式化为两位小数的重复问题。 - ma11hew28
显示剩余2条评论
38个回答

3
这里还有一个通用函数,可以格式化为任意位数的小数:
function numberFormat(val, decimalPlaces) {

    var multiplier = Math.pow(10, decimalPlaces);
    return (Math.round(val * multiplier) / multiplier).toFixed(decimalPlaces);
}

2

请尝试以下代码:

function numberWithCommas(number) { 

   var newval = parseFloat(Math.round(number * 100) / 100).toFixed(2);

   return newval.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

2

function number_format(string,decimals=2,decimal=',',thousands='.',pre='R$ ',pos=' Reais'){
  var numbers = string.toString().match(/\d+/g).join([]);
  numbers = numbers.padStart(decimals+1, "0");
  var splitNumbers = numbers.split("").reverse();
  var mask = '';
  splitNumbers.forEach(function(d,i){
    if (i == decimals) { mask = decimal + mask; }
    if (i>(decimals+1) && ((i-2)%(decimals+1))==0) { mask = thousands + mask; }
    mask = d + mask;
  });
  return pre + mask + pos;
}
var element = document.getElementById("format");
var money= number_format("10987654321",2,',','.');
element.innerHTML = money;
#format{
display:inline-block;
padding:10px;
border:1px solid #ddd;
background:#f5f5f5;
}
<div id='format'>Test 123456789</div>


1
我将翻译如下:

在调用toFixed()之前,我需要决定使用parseFloat()还是Number()进行转换。以下是一个关于数字格式化的示例,用于捕获用户输入。

HTML:

<input type="number" class="dec-number" min="0" step="0.01" />

事件处理程序:

$('.dec-number').on('change', function () {
     const value = $(this).val();
     $(this).val(value.toFixed(2));
});

上述代码将导致 TypeError 异常。请注意,尽管 html 输入类型为 "number",但用户输入实际上是 "string" 数据类型。然而,toFixed() 函数只能在数字对象上调用。
我的最终代码如下:
$('.dec-number').on('change', function () {
     const value = Number($(this).val());
     $(this).val(value.toFixed(2));
});

我喜欢使用Number()而非parseFloat()的原因是,我不需要对空输入字符串或NaN值进行额外的验证。Number()函数会自动处理空字符串并将其转换为零。


1
你可以使用numeral.js
numeral(1.341).format('0.00') // 1.34
numeral(1.345).format('0.00') // 1.35

1
var quantity = 12;

var import1 = 12.55;

var total = quantity * import1;

var answer = parseFloat(total).toFixed(2);

document.write(answer);

1

正则表达式 - 另一种方法

输入的是字符串(因为使用了解析),所以我们可以仅通过字符串操作和整数计算来获取结果。

let toFix2 = (n) => n.replace(/(-?)(\d+)\.(\d\d)(\d+)/, (_,s,i,d,r)=> {
  let k= (+r[0]>=5)+ +d - (r==5 && s=='-');
  return s + (+i+(k>99)) + "." + ((k>99)?"00":(k>9?k:"0"+k));
})


// TESTs

console.log(toFix2("1"));
console.log(toFix2("1.341"));
console.log(toFix2("1.345"));
console.log(toFix2("1.005"));

说明

  • s表示符号,i表示整数部分,d表示小数点后的前两位数字,r表示其他数字(我们使用r[0]值来计算四舍五入)
  • k包含有关最后两位数字的信息(表示为整数)
  • 如果r[0]大于等于5,则将1添加到d - 但是在负数情况下(s=='-')并且r恰好等于5时,在这种情况下我们减去1(出于兼容性原因 - 同样的方式对于负数也适用于Math.round,例如Math.round(-1.5)==-1
  • 之后,如果最后两位数字k大于99,则将1添加到整数部分i

1

var num1 = "0.1";
document.getElementById('num1').innerHTML = (Math.round(num1 * 100) / 100).toFixed(2);

var num2 = "1.341";
document.getElementById('num2').innerHTML = (Math.round(num2 * 100) / 100).toFixed(2);

var num3 = "1.345";
document.getElementById('num3').innerHTML = (Math.round(num3 * 100) / 100).toFixed(2);
span {
    border: 1px solid #000;
    margin: 5px;
    padding: 5px;
}
<span id="num1"></span>
<span id="num2"></span>
<span id="num3"></span>


5
这段代码足以满足你的需求:parseFloat(num.toFixed(2)) - kva

0

使用precision方法扩展Math对象

Object.defineProperty(Math, 'precision',{
   value: function (value,precision,type){
             var v = parseFloat(value),
                 p = Math.max(precision,0)||0,
                 t = type||'round';
              return (Math[t](v*Math.pow(10,p))/Math.pow(10,p)).toFixed(p);
          }
    });

console.log(
    Math.precision(3.1,3), // round 3 digits 
    Math.precision(0.12345,2,'ceil'), // ceil 2 digits
    Math.precision(1.1) // integer part
)


0

我喜欢:

var num = 12.749;
parseFloat((Math.round(num * 100) / 100).toFixed(2)); // 123.75

将数字四舍五入到小数点后2位, 然后确保使用parseFloat()进行解析,以返回数字而不是字符串,除非您不关心它是字符串还是数字。


我猜如果目的是显示两位小数精度,解析浮点数将会影响它。例如:parseFloat("1.00") // 1 - Stijn de Witt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接