Number.prototype.split3_1 =function(){ var r =""; var s =this.toString().split("").reverse(); for(var i = 0; i < s.length; i++){ if(i % 3 == 0 && i != 0 && s[i] !="-"){
r = s[i]+","+ r }else{
r = s[i]+ r; } } return r; }
Number.prototype.split3_2 =function(){ var to =String(this); var tmp =""; while(to !=(tmp = to.replace(/^([+-]?\d+)(\d\d\d)/,"$1,$2"))){
to = tmp; } return to; }
Number.prototype.split3_3 =function(){ var m =(this < 0)? -1 : 1; var str =String(this*m).split('.'); var arr =String(str[0]).split(''), len =Math.ceil(arr.length/3), res =[]; for(var i =0;i<len;++i) res.push(arr.splice(-3,3).join('')); return(m == -1 ?'-':'')+ res.reverse().join(',')+(str[1]?'.'+ str[1]:''); };
Number.prototype.split3_ore =function(){ (''+this).match(/(-?)([0-9]+)(\.[0-9]*)?/); var sp =[RegExp.$1,RegExp.$2,RegExp.$3]; var x =Math.floor(sp[1].length / 3) * 3; var len = sp[1].length; return sp[0]+(sp[1].substr(0, len - x))+(len - x == 0 ?'':',')+ (sp[1].substr(len - x, x).match(/[0-9]{3}/g).join(','))+ sp[2]; }
私ならこう書く。 Number.prototype.split3 =function(){ var r ="", s =this.toString().split("").reverse().join("").replace(/\d{3}/g, function(v){r+=v+',';return''}); return(r + s).split("").reverse().join(""); } alert((1000000).split3())// 1,000,000
文字列を逆にして、replaceに指定した関数で3桁毎にカンマを入れた結果と、空で置換したsubstituteの結果(あまった結果)を足す。その後文字列を逆にして戻す。 マイナスもたぶんOK。
追記1
しまった。チェック甘すぎ。 Number.prototype.split3 =function(){ var r ="", s =this.toString().split("").reverse().join("").replace(/\d{3}/g, function(v){r+=v+',';return''}); if(!s.match(/\d/)) r = r.substr(0, r.length-1); return(r + s).split("").reverse().join(""); }
計測してみる! mattnおそ!www
関数呼び出しコストか? 追記2
うむ。小数か... Number.prototype.split3_mattn2 =function(){ var r ='', s =this.toString();
s.match(/(-?)([0-9]+)(\.[0-9]*)?/); var sp =[RegExp.$1, s = parseInt(RegExp.$2),RegExp.$3]; while(s >= 1000){
r =','+(s%1000)+ r;
s = parseInt(s/1000); } return sp[0]+ s + r + sp[2]; } -12345678.2356を3桁ごとに区切るテスト