原文出处:https://zhidao.baidu.com/question/588397625.html (代码已做调整)
代码如下:
/*
* 格式化数字显示方式
* 用法
* formatNumber(12345.999,'#,##0.00');
* formatNumber(12345.999,'#,##0.##');
* formatNumber(123,'000000');
* @param num
* @param pattern
*/
public formatNumber(num:number, pattern: string) {
var fmtarr = pattern ? pattern.split('.') : ['']; // 格式化字串转为数组
// 四舍五入处理
var decimals = (fmtarr.length > 1 ? fmtarr[1].length : 0); // 小数位
num = Math.round(num * Math.pow(10, decimals)) / Math.pow(10, decimals);
var strarr = num ? num.toString().split('.') : ['0']; // 值->字符串->数组
var retstr = '';
// 整数部分
var str = strarr[0];
var fmt = fmtarr[0];
var i = str.length - 1;
var comma = false;
for (var f = fmt.length - 1; f >= 0; f--) {
switch (fmt.substr(f, 1)) {
case '#':
if (i >= 0) {
retstr = str.substr(i--, 1) + retstr; // 加当前字符
}
break;
case '0':
if (i >= 0) {
retstr = str.substr(i--, 1) + retstr; // 加当前字符
}
else {
retstr = '0' + retstr; // 补0
}
break;
case ',':
comma = true; // 有千位符
retstr = ',' + retstr; // 直接加上逗号(,)
break;
}
}
// 整数字符串替换格式后剩余字符串处理
if (i >= 0) {
if (comma) {
var l = str.length;
for (; i >= 0; i--) {
retstr = str.substr(i, 1) + retstr;
if (i > 0 && ((l - i) % 3) == 0) {
retstr = ',' + retstr; // 加上千位符
}
}
}
else {
retstr = str.substr(0, i + 1) + retstr; // 无千位符直接加在前面
}
}
retstr = retstr + '.';
// 处理小数部分
str = strarr.length > 1 ? strarr[1] : '';
fmt = fmtarr.length > 1 ? fmtarr[1] : '';
i = 0;
for (let f = 0; f < fmt.length; f++) {
switch (fmt.substr(f, 1)) {
case '#':
if (i < str.length) {
retstr += str.substr(i++, 1); // 加当前字符
}
break;
case '0':
if (i < str.length) {
retstr += str.substr(i++, 1); // 加当前字符
}
else {
retstr += '0'; // 补0
}
break;
}
}
// 返回
// 1.去掉开头的逗号(,)和加号(+);2.结尾的小数点(.)
return retstr.replace(/^,+/, '').replace(/\.$/, '');
}