読者です 読者をやめる 読者になる 読者になる

JavaScriptで数値を3桁ごとに区切る

JavaScript

3桁ごとに区切る - Higé au lait
iandeth. - javascriptで数値をカンマ区切り文字列に変換する関数メモ

とりあえず書いたの。Array#spliceで後ろから三桁ずつ切る。

Number.prototype.split3=function(){
	var arr = String(this).split(''), len = Math.ceil(arr.length/3), res = [];
	for (var i =0;i<len;++i) res.push(arr.splice(-3,3).join(''));
	return res.reverse().join(',');
};

でも、これはマイナスと小数点に対応してなかった。orz

Number.prototype.split3=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] : '');
};

で、こんな感じかなぁ。
マイナスと小数点にも一応対応したけど、すっきりしない。

追記:

Opera,IEで動かないと思ったら、Array.splice()関数の挙動の違い - 「はこだ手くん」の日記だった。。
splice(-3)をsplice(-3,3)に修正。

追記2:

comma separation by javascript - gotin blogをみて、pushしてreverseではなく、unshiftする方法がすごくスマートだったので、その点と+α修正。パフォーマンスに大差はないです。

Number.prototype.split3=function(){
	var m = this < 0;
	var str = String(this*(m?-1:1)).split('.');
	var arr = String(str[0]).split(''), len = Math.ceil(arr.length/3), res = [];
	for (var i =0;i<len;++i) res.unshift(arr.splice(-3,3).join(''));
	return (m ? '-' : '') + res.join(',') + (str[1] ? '.' + str[1] : '');
};

各所のパフォーマンスチェックでは私のは軒並みビリorz
でも、ちゃんと動いてるので気にしない。

あと、gotinさんのはビット演算使えばさらに高速化できそう。