
所谓的千位数形式,即从一位开始,在每三位之间添加一个逗号. 例如“ 10,000”. 为了满足这一需求,我首先编写了这样的函数:
复制代码,代码如下:
//方法1
函数到千(num){
var结果= [],计数器= 0;
num =(num || 0).toString(). 分割('');
for(var i = num.length-1; i> = 0; i--){
计数器++;
result.unshift(数字[i]);
if(!(%% 3)&& i!= 0){result.unshift(',');}
}
return result.join('');
}
方法一的执行是将数字转换为字符串并将其分解为数组,然后从头开始,将数组的元素一一插入到新数组的开头(结果). 每次插入元素时jsp页面格式化数字,都会对计数器计数(加1). 当计数器为3的倍数时,将插入逗号,但是请注意,开头(当i为0时)不需要逗号. 最后,通过调用新数组的join方法获得结果.
方法1相对清晰易懂,并且已经在项目中使用了一段时间. 但是直觉告诉我它的性能不好.
方法一的方法二-字符串版本
复制代码,代码如下:
//方法二
函数到千(num){

var结果='',计数器= 0;
num =(num || 0).toString();
for(var i = num.length-1; i> = 0; i--){
计数器++;
result = num.charAt(i)+结果;
if(!(计数器%3)&& i!= 0){结果=','+结果;}
}
返回结果;
}
方法2是方法1的改进版本. 它不会将字符串分成数组,并且始终对字符串进行操作.
方法3-在循环末尾匹配三个数字
复制代码,代码如下:
//方法三
函数到千(num){
var num =(num || 0).toString(),re = / \ d {3} $ /,结果='';
同时(重新测试(数字)){
result = RegExp.lastMatch +结果;
if(num!== RegExp.lastMatch){
result =','+结果;

num = RegExp.leftContext;
}其他{
num ='';
休息;
}
}
if(num){结果= num +结果;}
返回结果;
}
方法3是完全不同的算法. 它在正则表达式的末尾循环显示三个数字. 每次匹配时,它将逗号和匹配的内容插入到结果字符串的开头,然后匹配目标(数字). 分配尚未匹配的值(RegExp.leftContext). 另外,请注意:
1. 如果位数是3的倍数,则最后一个匹配项必须是三位数,但是前三位数之前不需要逗号;
2. 如果位数不是3的倍数,则num变量肯定会剩下1或2位数字. 循环之后,必须将其余数字插入结果字符串的开头.
尽管方法3减少了循环次数(一次处理三个字符),但使用了正则表达式,这在一定程度上增加了消耗.
方法3的方法4字符串版本
复制代码,代码如下:
//方法4
函数到千(num){
var num =(num || 0).toString(),结果='';
while(num.length> 3){

result =','+数字切片(-3)+结果;
num = num.slice(0,num.length-3);
}
if(num){结果= num +结果;}
返回结果;
}
实际上,截断最后三个字符的功能可以通过字符串类型的slice,substr或substring方法完成. 这样可以避免使用正则表达式.
方法5: 分组和合并方法
复制代码,代码如下:
//方法5
函数到千(num){
var num =(num || 0).toString(),temp = num.length%3;
开关(温度){
情况1:
num ='00'+ num;
休息;
情况2:
num ='0'+ num;
休息;

}
返回数字匹配(/ \ d {3} / g).join(','). 替换(/ ^ 0 + /,'');
}
首先将位数乘以3的倍数,通过正则表达式将其分成每三位数的组,通过join方法添加逗号,最后从补码中删除零.
方法6-惰性方法
复制代码,代码如下:
//方法6
函数到千(num){
返回(num || 0).toString(). replace(/(\ d)(?=(?: \ d(3})+ $)/ g,'$ 1,');
}
我一直认为可以通过替换正则表达式来完成这种格式设置,但是它需要使用断言和其他表达式,但是我对这部分并不熟悉. Google有点,确实找到了这样的正则表达式,估计这是最短的代码实现.
测试结果
5000次执行数字所花费的时间(ms)
方法一方法二方法三方法四方法五方法六
10000
100000
方法1和方法2的强烈对比表明,字符串运算的效率远高于数组运算的效率;方法6的测试结果告诉我们,代码的长度与性能无关. 方法4的整体性能是最好的(但是当num为100时为什么性能会降低,这真的很难理解),主要原因是:
1. 对比方法一和二,每次操作3个字符而不是1个字符,减少循环次数;
2. 比较方法三,五和六,而无需使用正则表达式jsp页面格式化数字,从而减少了消耗.
最后,我选择了方法4作为最终的优化解决方案. 读者可以评论更好的实现方法或改进.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-146727-1.html
没用