一道火了很久的面试题,
//将以下数字从小数点前开始每三位数加一个逗号var num = 1234567890.12345;复制代码
相信大家写了这么久的前端代码,不论是培训也好,面试也好,这种题出现的频率挺高的,
网上方法很多,但是我要给大家介绍2中简单易懂的方式
1.toLocalString()
let newNum = num.toLocalString(); /* * => 1,234,567,890.12345* 最快的作弊方式
*/复制代码
下面来看下这个方法吧,MDN的解释是,
/* * toLocaleString() 返回一个字符串表示数组中的元素。* 数组中的元素将使用各自的 toLocaleString 方法转成字符串, * 这些字符串将使用一个特定语言环境的字符串(例如一个逗号 ",")隔开。*/复制代码
简直是作弊的无法无天!
2.下面来看下本人的写的low方法
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);复制代码
这个代码量的确有点可怕.... 来看下具体思路吧
/*1 => 首先将数字类型转换成字符串,用indexof来索引是否存在小数点2 => 切割start开始字符串和end结束拥有小数点后的字符串3 => 对start进行取模,将余数用newStart存储起来,并且在start字符串中删除对应拥有的。4 => 遍历得到哪些项是符合的5 => 数组反转(多余操作...其实j++就可以了...)对字符串进行符合项切割6 => 判断是否存在余数 返回不同的值*/复制代码
写完,哇的一下就哭出来了...
以后还是要多深入了解一下js啊,知道的太浅了...
每天和大家一起进步一点点