JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去

前端开发中经常会碰到用 JavaScript?格式化数字,最最常见的是格式化金额,一般格式化金额需要千分位分隔,保留2位小数等等。

简单的功能函数

类似的代码网上有很多:

/**
 * 将数值四舍五入(保留2位小数)后格式化成金额形式
 *
 * @param num 数值(Number或者String)
 * @return 金额格式的字符串,如\'1,234,567.45\'
 * @type String
 */
function formatCurrency(num) {
  num = num.toString().replace(/\\$|\\,/g,\'\');
  if(isNaN(num))
    num = \"0\";
  sign = (num == (num = Math.abs(num)));
  num = Math.floor(num*100+0.50000000001);
  cents = num%100;
  num = Math.floor(num/100).toString();
  if(cents<10)
  cents = \"0\" + cents;
  for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
  num = num.substring(0,num.length-(4*i+3))+\',\'+
  num.substring(num.length-(4*i+3));
  return (((sign)?\'\':\'-\') + num + \'.\' + cents);
}

或者

function fmoney(s, n) {
  /*
   * 参数说明:
   * s:要格式化的数字
   * n:保留几位小数
   * */
  n = n > 0 && n <= 20 ? n : 2;
  s = parseFloat((s + \"\").replace(/[^\\d\\.-]/g, \"\")).toFixed(n) + \"\";
  var l = s.split(\".\")[0].split(\"\").reverse(),
    r = s.split(\".\")[1];
  t = \"\";
  for (i = 0; i < l.length; i++) {
    t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? \",\" : \"\");
  }
  return t.split(\"\").reverse().join(\"\") + \".\" + r;
}
//调用
fmoney(9.7,2);//9.70
fmoney(\'12345.675910\', 3);//12,345.676

更加完善的功能函数

这些代码基本能很好的运行。不过关系到经济利益的时候,还要考虑舍去或者舍入几厘。大家懂的,每个用户几厘钱可能带来巨大的经济收益。就比如说收手续费,如果一笔手续费计算出来是 3.4521 元,精确到分一般都会收 3.46 元。当然如果是付出去,那可能就是直接舍去了,一般会计算为 3.45 元。

以前收集过类似方法,不过在使用的时候会有BUG,JS 浮点型计算的精度问题。所以抽时间修复了一下:

function number_format(number, decimals, dec_point, thousands_sep,roundtag) {
  /*
  * 参数说明:
  * number:要格式化的数字
  * decimals:保留几位小数
  * dec_point:小数点符号
  * thousands_sep:千分位符号
  * roundtag:舍入参数,默认 \"ceil\" 向上取,\"floor\"向下取,\"round\" 四舍五入
  * */
  number = (number + \'\').replace(/[^0-9+-Ee.]/g, \'\');
  roundtag = roundtag || \"ceil\"; //\"ceil\",\"floor\",\"round\"
  var n = !isFinite(+number) ? 0 : +number,
    prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
    sep = (typeof thousands_sep === \'undefined\') ? \',\' : thousands_sep,
    dec = (typeof dec_point === \'undefined\') ? \'.\' : dec_point,
    s = \'\',
    toFixedFix = function (n, prec) {
 
      var k = Math.pow(10, prec);
      console.log();
 
      return \'\' + parseFloat(Math[roundtag](parseFloat((n * k).toFixed(prec*2))).toFixed(prec*2)) / k;
    };
  s = (prec ? toFixedFix(n, prec) : \'\' + Math.round(n)).split(\'.\');
  var re = /(-?\\d+)(\\d{3})/;
  while (re.test(s[0])) {
    s[0] = s[0].replace(re, \"$1\" + sep + \"$2\");
  }
 
  if ((s[1] || \'\').length < prec) {
    s[1] = s[1] || \'\';
    s[1] += new Array(prec - s[1].length + 1).join(\'0\');
  }
  return s.join(dec);
}
console.log(number_format(2, 2, \".\", \",\"))//\"2.00\"
console.log(number_format(3.7, 2, \".\", \",\"))//\"3.70\"
console.log(number_format(3, 0, \".\", \",\")) //\"3\"
console.log(number_format(9.0312, 2, \".\", \",\"))//\"9.03\"
console.log(number_format(9.00, 2, \".\", \",\"))//\"9.00\"
console.log(number_format(39.715001, 2, \".\", \",\", \"floor\")) //\"39.71\"
console.log(number_format(9.7, 2, \".\", \",\"))//\"9.70\"
console.log(number_format(39.7, 2, \".\", \",\"))//\"39.70\"
console.log(number_format(9.70001, 2, \".\", \",\"))//\"9.71\"
console.log(number_format(39.70001, 2, \".\", \",\"))//\"39.71\"
console.log(number_format(9996.03, 2, \".\", \",\"))//\"9996.03\"
console.log(number_format(1.797, 3, \".\", \",\", \"floor\"))//\"1.797\"

参数有点多,你可以根据你自己的需求去修改。

推荐的类库 Numeral.js 和 accounting.js

Numeral.js

一个用于格式化和操作数字的JavaScript库。数字可以被格式化为货币,百分比,时间,几个小数位数,千分位等等。 您也可以随时创建自定义格式。

官网及文档:http://numeraljs.com/

GitHub:https://github.com/adamwdraper/Numeral-js

accounting.js

一个轻量级的JavaScript库,用于格式化数字,金额和货币等。

官网及文档:http://openexchangerates.github.io/accounting.js/

GitHub:accounting.js

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容