在上一篇文章中写了实现“金钱”格式的一种方法,然后刚才又从司徒正美博客上看到了10种方法,据说是某公司的笔试题,可谓是一千个人有一千个哈姆雷特~具体要求是:将一段数字从右到左每隔三位插入一个逗号。
其实,正则很强大!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
window.onload = function(){ //整个测试由小刀提供 var testFun = function( callback, str ){ var tipElem = document.createElement( 'div' ), startTime, duration = 0; for( var j = 5; j > 0; j-- ){ startTime = +new Date(); for( var i = 10000; i > 0; i-- ){ callback(); } duration = ((+new Date()) - startTime) + duration; } duration = (duration / 5).toFixed(0); tipElem.innerHTML = str + '总耗时:' + duration + ' ms'; document.body.appendChild( tipElem ); }; var str = '3345687687876789123'; var cuter1 = function( str ){//带刀 var len = str.length, lastIndex, arr = []; while( len > 0 ){ lastIndex = len; len -= 3; arr.unshift( str.substring(len, lastIndex) ); } return arr.join(','); }; var cuter2 = function( str ){//abcd return str.replace( /\B(?=(?:\d{3})+$)/g, ',' ); }; var cuter3 = function( str ){//前叔 return str.replace(/(.*)(\d{3})$/,function(){ if(arguments[1]&& arguments[2]){ return arguments[1].replace(/(.*)(\d{3})$/,arguments.callee)+","+arguments[2]; } else { return arguments[0]; } }); }; var cuter4 = function( str ){//Alucelx return str.split('').reverse().join('').replace(/(\d{3})/g, '$1,').split('').reverse().join(''); }; var cuter5 = function( str ){//司徒正美 var ret = []; while(str){ str = str.replace(/\d{1,3}$/g,function(a){ ret.unshift(a) return "" }); } return ret.join(","); }; var cuter6 = function( str ){//司徒正美 var n = str.length % 3; if(n){ return str.slice(0,n) + str.slice(n).replace(/(\d{3})/g,',$1') }else{ return str.replace(/(\d{3})/g,',$1').slice(1) } }; var cuter7 = function(str){//司徒正美 var ret = "" for(var i = 0, n = str.length, m = n %3 - 1; i < n; i++){ ret += str.charAt(i) if( i % 3 === m ){ ret += "," } } var e = ret.length - 1 return ret.charAt(e) == "," ? ret.slice(0,e) : ret } var cuter8 = function(str){//[[valueOf]] var s2 = [].slice.call(str); for(var i=s2.length-3; i>0;i-=3){ s2.splice(i, 0 ,',' ); } return s2.join("") } var cuter9 = function(str){//听说 var newStr= new Array(str.length+ parseInt(str.length/3)); newStr[newStr.length-1]=str[str.length-1]; var currentIndex=str.length-1; for(var i = newStr.length-1;i >= 0;i--) { if((newStr.length-i)%4==0) { newStr[i]=","; }else{ newStr[i]=str[currentIndex--]; } } return newStr.join("") } var cuter10 = function(str){//Rekey var len = str.length, str2 = '', max = Math.floor(len / 3); for(var i = 0 ; i < max ; i++){ var s = str.slice(len - 3, len); str = str.substr(0, len - 3); str2 = (',' + s) + str2; len = str.length; } str += str2; return str } //下面是性能测试 testFun(function(){ cuter1(str); }, '方法一' ); testFun(function(){ cuter2(str); }, '方法二' ); testFun(function(){ cuter3(str); }, '方法三' ); testFun(function(){ cuter4(str); }, '方法四' ); testFun(function(){ cuter5(str); }, '方法五' ); testFun(function(){ cuter6(str); }, '方法六' ); testFun(function(){ cuter7(str); }, '方法七' ); testFun(function(){ cuter8(str); }, '方法八' ); testFun(function(){ cuter9(str); }, '方法九' ); testFun(function(){ cuter10(str); }, '方法十' ); } |
转载自:司徒正美
很好啊.谢谢博主啊