伦宝前两天面试了一家web3公司,面试官在手写环节直接抛出一道手写题:实现一个将数字每千分位用逗号隔开的函数,需要考虑不带小数和带小数两种情况。究竟该怎么回答呢,让我们来一起看看吧!
不带小数的情况
不带小数的情况,只需要考虑位数是否是三的倍数,若不是三的倍数则需要手动处理第一个逗号的位置。
function format1(n) {
let num = n.toString()
let len = num.length
if (len <= 3) {
// 无需处理
return num
} else {
// 位数不是三的倍数,则需要手动添加第一个,
let remainder = len % 3
if (remainder > 0) {
// 手动添加,的位置在remainder后
// match返回符合条件的数组,用join连接
return num.slice(0, remainder) + "," + num.slice(remainder, len).match(/\d{3}/g).join(",")
} else {
return num.match(/\d{3}/g).join(",")
}
}
}
let num = 12323232
console.log(format1(num)) //12,323,232
面试官点了点头,继续问:那你能实现带小数情况的函数吗,A4纸写一下
带小数的情况
带小数的情况需要先对小数部分进行保存,再对整数部分添加千分符分割
// 有小数:直接对小数进行保存
function format2(n) {
let num = n.toString() // 转成字符串
let decimals = ''
// 判断是否有小数
if (num.indexOf(".") > -1) {
decimals = num.split('.')[1]
// 取整数部分
num = num.split('.')[0]
}
let len = num.length // 整数部分长度
let temp = ''
decimals ? temp = '.' + decimals : temp
if (len <= 3) {
// 整数部分
return decimals ? num + temp : num
} else {
let remainder = len % 3
if (remainder > 0) { // 不是3的整数倍
return num.slice(0, remainder) + ',' + num.slice(remainder, len).match(/\d{3}/g).join(',') + temp
} else { // 是3的整数倍
return num.slice(0, len).match(/\d{3}/g).join(',') + temp
}
}
}
let decimals1 = 3333.33
let decimals2 = 333.33
let decimals3 = 33333
console.log(format2(decimals1)) //3,333.33
console.log(format2(decimals2)) //333.33
console.log(format2(decimals3)) //33,333
大功告成,测试用例通过。此题的回答得到了面试官的认可,欲知后事如何,下回分解。
总结
本题主要考察了正则表达式的灵活运用能力,以及对于数字位数能否被3整除的分类处理。将数字每千分位用逗号隔开的函数需要考虑不带小数的情况和带小数的情况,带小数需要对边界情况进行考虑。