2584


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]

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


CC BY-SA 3.0
2014-12-25T14:35:07.877
2582
2014-12-25T16:15:36.580
2014-12-25T15:47:42.253
440
3925
question
javascript 正規表現
JavaScriptで数値をカンマ区切りでフォーマットする方法

[code]

    Number.prototype.split3 = 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];
    }
    console.log((1234.5678).split3()); // 1,234.5678
    
[/code]

整数だけならもう少し速い方法もあります。

<http://mattn.kaoriya.net/software/lang/javascript/20071206095908.htm>


CC BY-SA 3.0
2014-12-25T14:50:53.817
2583
2014-12-25T14:50:53.817
440
2582
answer


正規表現もいいですけど、 [`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)かもしれません。


CC BY-SA 3.0
2014-12-25T14:58:16.347
2584
2014-12-25T15:30:03.757
2014-12-25T15:30:03.757
4978
4978
2582
answer

[code]

    var re = /(?:^|[^.])(\d)(?=(\d\d\d)+(?!\d))/g;
    String(1234.5678).replace(re, '$1,'); // "1,234.5678"
    
[/code]

先頭かピリオド以外という条件を加えてはどうでしょうか？


CC BY-SA 3.0
2014-12-25T15:12:03.833
2585
2014-12-25T15:12:03.833
4236
2582
answer

[code]

    Number.prototype.toCommify = function() {
        return this.toString().replace(/^(-?)(\d+)(?=(\.\d+)?$)/, function() {
            return arguments[1] + arguments[2].replace(/(\d+?)(?=(\d{3})+$)/g, '$1,');
        });
    };
    
[/code]

整数部と小数部を分けてしまえば。


CC BY-SA 3.0
2014-12-25T15:33:51.833
2588
2014-12-25T15:33:51.833
5762
2582
answer


正規表現のみでできるのかもしれませんが、 小数点を含む場合は、'.' で分けたほうが手っ取り早いと思います

[code]

    function commafy(n) {
      var parts = n.toString().split('.');
      parts[0] = parts[0].replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
      return parts.join('.');
    }
    
[/code]


CC BY-SA 3.0
2014-12-25T16:15:36.580
2590
2014-12-25T16:15:36.580
4106
2582
answer