「javaScript-每三位插入一个逗号实现方式」

3,375

 一道火了很久的面试题,

//将以下数字从小数点前开始每三位数加一个逗号

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啊,知道的太浅了...


每天和大家一起进步一点点