カンマ区切りフォーマットの実装例です。
正規表現でオーソドックスに処理オーソドックスなのは正規表現で「肯定的前方先読み」を使う方法。 RegExp - MDN
str.replace(/(\d)(?=(\d\d\d)+$)/g, "$1,"); 関数化するならこんな感じ。値が文字列でも数値でもいいようにしています。
function addComma(val) { return ("" + val).replace(/(\d)(?=(\d\d\d)+$)/g, "$1,"); } さらに数値チェックをするならこんな感じ。
function addComma(val) { if (isNaN(val)) { return this; } return ("" + val).replace(/(\d)(?=(\d\d\d)+$)/g, "$1,"); } ただし、整数であることが条件です。
NumberオブジェクトのtoLocaleStringメソッドを使うNumberオブジェクトのtoLocaleStringメソッドを使うと簡単です。
(123456789).toLocaleString() //IE5-10→"123,456,789.00" //IE11, Chrome37→"123,456,789" (123456789.0123456789).toLocaleString() //IE5-10→"123,456,789.01" //IE11, Chrome37→"123,456,789.012" …しかし
等の問題があります。
なお以下のようにオプションも書くと小数部分の表示桁数も指定できます。しかしIE10以前では対応していないようです。
(123456789.0123456789).toLocaleString("ja-JP", {minimumSignificantDigits : 5}) //IE5-10→"123,456,789.01" //IE11, Chrome37→"123,456,789.012346" 小数値にも対応したバージョン昔がんばって作ったもの。数値チェックの付加と、符号・小数点も考慮したので、まだ使えるかもしれません。
/** * カンマ区切りフォーマット関数 */ String.prototype.addComma = function() { if (isNaN(this)) { return this; } return this.replace( /^([+-]?\d{1,3})((\d{3})+)((\.\d+)?)$/g, function() { return arguments[1] + arguments[2].replace(/(\d{3})/g, ",$1") + arguments[4]; } ); } こっちの方がいいかな? /** * カンマ区切りフォーマット関数 */ function addComma(val) { if (isNaN(val)) { return this; } return ("" + val).replace( /^([+-]?\d{1,3})((\d{3})+)((\.\d+)?)$/g, function() { return arguments[1] + arguments[2].replace(/(\d{3})/g, ",$1") + arguments[4]; } ); } もしくはこう。 function addComma(val) { if (isNaN(val)) { return this; } return ("" + val).replace( /^([+-]?\d{1,3})((\d{3})+)((\.\d+)?)$/g, function(s, p1, p2, p3, p4) { return p1 + p2.replace(/(\d{3})/g, ",$1") + p4; } ); } 数値チェックをなくすと1行でも書ける…。 function addComma(val) { return ("" + val).replace(/^([+-]?\d{1,3})((\d{3})+)((\.\d+)?)$/g, function(s, p1, p2, p3, p4) {return p1 + p2.replace(/(\d{3})/g, ",$1") + p4;}); } 余談カンマ区切りフォーマットはごく当たり前に利用するものですが、その実装は本当にさまざまです。新入社員や正規表現を知らない人などが作るコードで、文字数分ループし「charAt」で一文字ずつ取り出して確認しながら新しい文字列にカンマを足していく…という原始的なコードをみかけることがあります。そういうコードだけは避けたほうがいいように思います。
2011/07/18
2011/12/08
2014/09/11
|
Code Tips >