JavaScript格式化数字、⾦额、千分位、保留⼏位⼩数、
舍⼊舍去
前端开发中经常会碰到⽤ JavaScript?格式化数字,最最常见的是格式化⾦额,⼀般格式化⾦额需要千分位分隔,保留2位⼩数等等。
简单的功能函数
类似的代码⽹上有很多:
/**
* 将数值四舍五⼊(保留2位⼩数)后格式化成⾦额形式
*
* @param num 数值(Number或者String)
* @return ⾦额格式的字符串,如'1,234,567.45'
* @type String
*/
function formatCurrency(num) {
trunc函数去掉千位是几位数num = String().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) : '' + und(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库。数字可以被格式化为货币,百分⽐,时间,⼏个⼩数位数,千分位等等。您也可以随时创建⾃定义格式。
accounting.js
⼀个轻量级的JavaScript库,⽤于格式化数字,⾦额和货币等。
GitHub:
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论