1 数值转字符串遍历
整体思路: 数字转字符串, 整数部分低位往高位遍历。
- 数字转字符串,字符串按照 .分割
- 整数部分拆分成字符串数组,并倒叙
- 遍历,按照每3位添加“,”号
- 拼接整数部分 + 小数部分`
function format_with_array(number) {
// 转为字符串,并按照.拆分
var arr = (number + '').split('.');
// 整数部分再拆分
var int = arr[0].split('');
// 小数部分
var fraction = arr[1] || '';
// 返回的变量
var r = "";
var len = int.length;
// 倒叙并遍历
int.reverse().forEach(function (v, i) {
// 非第一位并且是位值是3的倍数, 添加 ","
// console.log(v);
if (i !== 0 && i % 3 === 0) {
r = v + "," + r;
} else {
// 正常添加字符
r = v + r;
}
})
// 整数部分和小数部分拼接
return r + (!!fraction ? "." + fraction : '');
}
const print = console.log;
print(format_with_array(938765432.02));
2 字符串+ substring截取
整体思路: 数字转字符串, 整数部分高位往低位遍历,三位分组。
- 数字转字符串,并按照 .分割
- 整数部分对3求模, 获取多余部分
- 按照3截取,并添加,
- 拼接整数部分 + 小数部分
function format_with_substring(number) {
// 数字转字符串, 并按照 .分割
var arr = (number + '').split('.');
var int = arr[0] + '';
var fraction = arr[1] || '';
// 多余的位数
var f = int.length % 3;
// 获取多余的位数,f可能是0, 即r可能是空字符串
var r = int.substring(0, f);
// 每三位添加","和对应的字符
for (var i = 0; i < Math.floor(int.length / 3); i++) {
r += ',' + int.substring(f + i * 3, f + (i + 1) * 3)
}
//多余的位数,上面
if (f === 0) {
r = r.substring(1);
}
// 整数部分和小数部分拼接
return r + (!!fraction ? "." + fraction : '');
}
const print = console.log;
print(format_with_substring(938765432.02));
除法+求模
整体思路:求模的值添加",",求余值(是否大于1)计算是够结束.
- 值对1000求模,获得最高三位
- 值除以1000,值是否大于1 判定是否结束
- 重复1.2, 直到退出
- 拼接整数部分 + 小数部分
function format_with_mod(number) {
var n = number;
var r = "";
var temp;
do {
// 求模的值,用于获取高三位,这里可能有小数
mod = n % 1000;
console.log("mod="+mod);
// 值是不是大于1,是继续的条件(>=1,表示前面还有3位或者3位以上)
n = n / 1000;
console.log("n="+n)
// 高三位
temp = ~~mod;
console.log("temp="+temp);
// 1. 填充 : n>1 循环未结束, 就要填充为比如,1 => 001,
// 不然 1 001, 就会变成 '11',
// 2. 拼接 ","
r = (n >= 1 ?`${temp}`.padStart(3, "0"): temp) + (r ? "," + r : "")
} while (n >= 1)
var strNumber = number + "";
var index = strNumber.indexOf(".");
// 拼接小数部分,
if (index >= 0) {
r += strNumber.substring(index);
}
return r;
}
const print = console.log;
print(format_with_mod(938765432.02));
正则先行断言等
function format_with_regex(number) {
var reg = /\d{1,3}(?=(\d{3})+$)/g;
return (number + '').replace(reg, '$&,');
}
Intl.NumberFormat
基本功能:国际化的数字处理方案,它可以用来显示不同国家对数字对处理偏好 语法:new Intl.NumberFormat([locales[, options]])
function format_with_Intl(number, minimumFractionDigits, maximumFractionDigits) {
minimumFractionDigits = minimumFractionDigits || 2;
maximumFractionDigits = (maximumFractionDigits || 2);
maximumFractionDigits = Math.max(minimumFractionDigits, maximumFractionDigits);
return new Intl.NumberFormat('en-us', {
maximumFractionDigits: maximumFractionDigits || 2,
minimumFractionDigits: minimumFractionDigits || 2
}).format(number)
}
// 使用默认配置选项
// function format_with_Intl(number) {
// return new Intl.NumberFormat('en-us').format(number)
// }
const print = console.log;
print(format_with_Intl(938765432.02));
toLocalString
功能:其能把数字转为特定语言环境下的表示字符串
语法:numObj.toLocaleString([locales [, options]])
function format_with_toLocaleString(number, minimumFractionDigits, maximumFractionDigits) {
minimumFractionDigits = minimumFractionDigits || 2;
maximumFractionDigits = (maximumFractionDigits || 2);
maximumFractionDigits = Math.max(minimumFractionDigits, maximumFractionDigits);
return number.toLocaleString("en-us", {
maximumFractionDigits: maximumFractionDigits || 2,
minimumFractionDigits: minimumFractionDigits || 2
})
}
// function format_with_toLocaleString(number) {
// return number.toLocaleString("en-us")
// }
const print = console.log;
print(format_with_toLocaleString(938765432.02));