一道火了好久的面试题,前端
//将如下数字从小数点前开始每三位数加一个逗号
var num = 1234567890.12345;复制代码
相信你们写了这么久的前端代码,不管是培训也好,面试也好,这种题出现的频率挺高的,面试
网上方法不少,可是我要给你们介绍2中简单易懂的方式数组
let newNum = num.toLocalString();
/*
* => 1,234,567,890.12345
* 最快的做弊方式
*/
复制代码
下面来看下这个方法吧,MDN的解释是,bash
/*
* toLocaleString() 返回一个字符串表示数组中的元素。
* 数组中的元素将使用各自的 toLocaleString 方法转成字符串,
* 这些字符串将使用一个特定语言环境的字符串(例如一个逗号 ",")隔开。
*/复制代码
简直是做弊的没法无天!ui
function changeNum(num) {
if(typeof num !== 'number') {
throw new Error('请传入数字');
return false;
}
// 切割小数点
num = num + '';
let index = 0,i = 0 ;
for (;i < num.length ; i++) {
if(num[i] === '.') {
index = i;
}
}
// 开始
let start = num.slice(0,index) ;
// 结束
let end = num.slice(index,-1) ;
let reson = [];
// console.log(start.length)
let firstStart = '',j = start.length;
// 判断是否为三位数的倍数
// 第一位
let newStart = start.slice(0,j % 3) ;
console.log(newStart,start)
start = start.replace(newStart,'');
// Math.floor(j % 3) === j % 3 ?
for(; j >= 0 ;j--){
// console.log(j)
// 遍历出符合的项
if( j % 3 === 0 && j !== start.length) {
console.log(j,'123')
reson.push(j)
}
}
// 存储被切割的字符串
let sliceStr = [];
// 反转数组
reson = reson.reverse();
// 遍历符合项切割数组
for(let k = 0 ; k < reson.length ; k++) {
console.log(reson[k],reson[k+1])
sliceStr.push(start.slice(reson[k],reson[k+1]))
}
// 返回新的数组
let newNum = '';
if(newStart) {
newNum = newStart + ',' + sliceStr.join(',') + end;
}else {
newNum = sliceStr.join(',') + end;
}
return newNum
}
let str = changeNum(num);复制代码
这个代码量的确有点可怕.... 来看下具体思路吧spa
/*
1 => 首先将数字类型转换成字符串,用indexof来索引是否存在小数点
2 => 切割start开始字符串和end结束拥有小数点后的字符串
3 => 对start进行取模,将余数用newStart存储起来,而且在start字符串中删除
对应拥有的。
4 => 遍历获得哪些项是符合的
5 => 数组反转(多余操做...其实j++就能够了...)对字符串进行符合项切割
6 => 判断是否存在余数 返回不一样的值
*/复制代码
写完,哇的一下就哭出来了... code
之后仍是要多深刻了解一下js啊,知道的太浅了...cdn
天天和你们一块儿进步一点点blog