转自 stackoverflow 、WEB前端开发@渔人码头,原文有删改
简化版本 1
n.toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,');
示例:
1234567 --> "1,234,567.00"
12345.67 --> "12,345.67"
简化版本 2
n.toFixed(2).replace(/./g, function(c, i, a) {
return i && c !== "." && ((a.length - i) % 3 === 0) ? ',' + c : c;
});
示例:
1234567 --> "1,234,567.00"
12345.67 --> "12,345.67"
版本3
/**
* Number.prototype.formatMoney(c, d, t)
* 支持自定义数组的分界符号、分隔符,支持负数,对数字进行四舍五入
*
* @param integer c: 保留到小数点后多少位
* @param integer d: 数字的分界符号,默认为小数点 .
* @param integer t: 以什么符号作为格式化后的分隔符,默认为逗号 ,
*/
Number.prototype.formatMoney = function(c, d, t){
var n = this,
s = n < 0 ? '-' : '',
i = String(parseInt(n = Math.abs(Number(n) || 0).toFixed(c))),
j = i.length
j = j > 3 ? j % 3 : 0
c = isNaN(c = Math.abs(c)) ? 2 : c
d = typeof d === 'undefined' ? '.' : d
t = typeof t === 'undefined' ? ',' : t
return s + (j ? i.substr(0, j) + t : '') + i.substr(j).replace(/(\d{3})(?=\d)/g, '$1' + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : '')
}
版本4
/**
* Number.prototype.format(n, x)
*
* @param integer n: length of decimal
* @param integer x: length of sections
*/
Number.prototype.format = function(n, x) {
var re = '\\d(?=(\\d{' + (x || 3) + '})+' + (n > 0 ? '\\.' : '$') + ')';
return this.toFixed(Math.max(0, ~~n)).replace(new RegExp(re, 'g'), '$&,');
};
示例:
1234..format(); // "1,234"
12345..format(2); // "12,345.00"
123456.7.format(3, 2); // "12,34,56.700"
123456.789.format(2, 4); // "12,3456.79"
版本5
/**
* Number.prototype.format(n, x, s, c)
*
* @param integer n: length of decimal
* @param integer x: length of whole part
* @param mixed s: sections delimiter
* @param mixed c: decimal delimiter
*/
Number.prototype.format = function(n, x, s, c) {
var re = '\\d(?=(\\d{' + (x || 3) + '})+' + (n > 0 ? '\\D' : '$') + ')',
num = this.toFixed(Math.max(0, ~~n));
return (c ? num.replace('.', c) : num).replace(new RegExp(re, 'g'), '$&' + (s || ','));
};
示例:
12345678.9.format(2, 3, '.', ','); // "12.345.678,90"
123456.789.format(4, 4, ' ', ':'); // "12 3456:7890"
12345678.9.format(0, 3, '-'); // "12-345-679"
版本6
/**
* 将数值四舍五入(保留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);
}
版本7
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
版本8
此版本考虑到实际情况,对数字进行格式化,比如说收手续费,如果一笔手续费计算出来是 3.4521
元,精确到分一般都会收 3.46
元。当然如果是付出去,那可能就是直接舍去了,一般会计算为 3.45
元。
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 s = n.toString();
var sArr = s.split(".");
var m = 0;
try {
m += sArr[1].length;
}
catch (e) {
}
if (prec > m) {
return s;
/*'' + Number(s.replace(".", "")) / Math.pow(10, m);*/
} else {
sArr[1] = Math[roundtag](Number(sArr[1]) / Math.pow(10, m - prec));
return sArr.join('.');
}
};
s = (prec ? toFixedFix(n, prec) : '' + Math.floor(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(3.7, 2, ".", ","))//"3.70"
console.log(number_format(3, 0, ".", ",")) //"3"
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"
版本9
var test1 = '12345678930.99'
var format = test1.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
// => 12,345,678,930.99
版本10
function formatCash(str) {
return str.split('').reverse().reduce((prev, next, index) => {
return ((index % 3) ? next : (next + ',')) + prev
})
}
console.log(formatCash('1234567890')) // 1,234,567,890
相关库
Numeral.js
一个用于格式化和操作数字的JavaScript库。数字可以被格式化为货币,百分比,时间,几个小数位数,千分位等等。 您也可以随时创建自定义格式。
accounting.js
一个轻量级的JavaScript库,用于格式化数字,金额和货币等。