JavaScriptで数値をカンマ区切りでフォーマットする方法


JavaScriptで数値をカンマ区切りする方法としては、
[こちら](http://qiita.com/zawascript/items/922b5db574ef2b126069)の正規表現を使った方法がメジャーなようですが、以下のように

[code]

    var re = /(\d)(?=(\d\d\d)+(?!\d))/g;
    String(1234).replace(re, '$1,');      // 1,234 OK
    String(1234.56).replace(re, '$1,');   // 1,234.56 OK
    String(1234.5678).replace(re, '$1,'); // 1,234.5,678 NG
    
[/code]

小数点以下が３桁を超えると破綻してしまいます。 どのような解決策があるでしょうか。




正規表現もいいですけど、 [`Number` の `toLocaleString()`](https://developer.mozilla.org/en-
US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString)
を使うと楽です。

[code]

    Number(1234).toLocaleString();
    -> "1,234"
    Number(1234.56).toLocaleString();
    -> "1,234.56"
    Number(1234.5678).toLocaleString(); 
    -> "1,234.568" or '1234.5678'
    
[/code]

オプションなしだと、小数点が丸められる場合がでてきますが、`IE < 11` を切り捨てられるなら、以下のような形でオプションが付けられます。

[code]

    Number(12345.6789).toLocaleString( undefined, { maximumFractionDigits: 20 })
    -> "12,345.6789"
    Number(12345).toLocaleString('ja-JP', { style: 'currency', currency: 'JPY' })
    -> "￥12,345"
    Number(1234.56).toLocaleString('zh-Hans-CN-u-nu-hanidec')
    -> "一,二三四.五六"
    
[/code]

※ mattn のコメントにあるように、 node.js では、カンマは付けられません。これは node.js の V8 が国際化を考慮した
[v8-i18n](https://code.google.com/p/v8-i18n/) を利用していないためのようです。node.js
の場合は[自前でコンパイルするコース](https://github.com/srl295/node/commit/ac2857b12cd819b68405b15c3f8e95e48bcc32d8)かもしれません。




正規表現もいいですけど、 [`Number` の `toLocaleString()`](https://developer.mozilla.org/en-
US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString)
を使うと楽です。

[code]

    Number(1234).toLocaleString();
    -> "1,234"
    Number(1234.56).toLocaleString();
    -> "1,234.56"
    Number(1234.5678).toLocaleString(); 
    -> "1,234.568" or '1234.5678'
    
[/code]

オプションなしだと、小数点が丸められる場合がでてきますが、`IE < 11` を切り捨てられるなら、以下のような形でオプションが付けられます。

[code]

    Number(12345.6789).toLocaleString( undefined, { maximumFractionDigits: 20 })
    -> "12,345.6789"
    Number(12345).toLocaleString('ja-JP', { style: 'currency', currency: 'JPY' })
    -> "￥12,345"
    Number(1234.56).toLocaleString('zh-Hans-CN-u-nu-hanidec')
    -> "一,二三四.五六"
    
[/code]

※ mattn のコメントにあるように、 node.js では、カンマは付けられません。これは node.js の V8 が国際化を考慮した
[v8-i18n](https://code.google.com/p/v8-i18n/) を利用していないためのようです。node.js
の場合は[自前でコンパイルするコース](https://github.com/srl295/node/commit/ac2857b12cd819b68405b15c3f8e95e48bcc32d8)かもしれません。

