格式化金额的简单解法
格式化金额的简单解法
很久没有写技术相关的博客了,刚好看到一个题目就想着写一个解法吧,因为简单,所以可能会比较实用。
问:请写出一个格式化金额的方法。
这个其实挺常见的,不过程序员都是比较懒的能上网搜的到的肯定不会自己写,有Git仓库的肯定直接拉来就用,我当然也不例外。
所以我就找了一个网上的方法。
//* 金额千分位加逗号,保留2位小数,不足补零,否则四舍五入
// * 参数说明:
// * num:要格式化的数字 string或者number
// * decimals:保留几位小数
// * dec_point:小数点符号
// * thousandsSep:千分位符号
// return 金额格式的字符串,如’1,234,567.45′
// * */
function number (num, decimals, thousandsSep) {
if (isNaN(num)) {
num = ‘0.00’
}
let prec = !isFinite(+decimals) ? 0 : Math.abs(decimals) // 保留的位数一定是有限位数的正整数
let sep = (typeof thousandsSep === ‘undefined’) ? ‘,’ : thousandsSep
let s = num.toString().replace(/,/g, ”) // 字符串,将,变成”;
let p = parseFloat(s) // 解析一个字符串,并返回一个浮点数
let n = isNaN(p) ? 1 : p
let formatNum = n.toFixed(prec).toString().replace(/(\d)(?=(\d{3})+\.)/g, function ($0, $1) {
return $1 + sep
})
return num ? formatNum : ”
}
// let num = number(333322.8199, 5,”)
// console.log(num,’nm’)
恩。。。其实也蛮简单的,但是看到正则了,正则对萌新其实是不友好的,所以我就自己又写了一个,希望对你有帮助吧。
/**
@number:需要格式化的数字
@decimals:小数点位数
@separator:千分位分割符
**/
function formatNumber(number,decimals,separator){
if(isNaN(Number(number))){
return “0”
}
let _separator = separator||”,”;
let _decimals = decimals||2;
let numberStr = number.toFixed(_decimals);
let splitArray = numberStr.split(“.”);
let left = splitArray[0];
let right = splitArray[1];
let array = left.split(”).reverse();
let array2 = []
for(let i = 0; i < array.length; i++){
if(i>0&&i%3===0){
array2.push(_separator);
}
array2.push(array[i]);
}
return array2.reverse().join(“”)+”.”+right;
}
let number = 20200421.56787;
formatNumber(number);
console .log(formatNumber(number,3,null))
//20,200,421.57
我的思路其实比较简单,线分割小数点,整数部分处理千分位,处理方法也比较常见,就是字符串和数组的一些方法,先把数组倒转,然后循环插入分隔符。
好了,就这样吧。如果你记不住正则,那么这个解法适合。
*后反思一下, 阿里给的*轮笔试就挂了,啊哈哈,三个题目就做了两个半,题目都很简单,是我自己没准备,虽然我比较讨厌刷题,但是如果你是为了一份工作的话,尤其是大厂,还是考虑下刷题吧,虽然拿到了别的offer。