一道火了好久的面試題,前端
//將如下數字從小數點前開始每三位數加一個逗號
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