Rubyで通貨表示 3桁ごとにカンマ

RubyのCGIで予約システム書いてて
金額を数字で扱っていて表示の時に通貨表示として
カンマを3桁ごとに表示したいとおもった。

Rubyでの数値の通貨フォーマット – CHNの中の人たちブログ

正規表現 – Rubyリファレンスマニュアル

上記のサイトを参考にしてIntegerにto_cというメソッドを
追加した。

class Integer
  def to_c
    str = to_s
    tmp = ""
    while(str.size > 3) do
      str.gsub!(/(.*\d)(\d\d\d)/,'\1')
      tmp = ",#{$2}" + tmp
    end
    str + tmp
  end
end

111222333.to_c  #  "111,222,333"

うえむらさんからのコメントでマイナスにも対応したものに修正してみました。

class Integer
  def to_c
    str = to_s
    tmp = ""
    while(str =~ /([-+]?.*\d)(\d\d\d)/) do
      str = $1
      tmp = ",#{$2}" + tmp
    end
    str + tmp
  end
end

-111.to_c      #  -11,222
-111222.to_c   # -111,222

最初は単純にサイトに書いてあるとおりに記述していたけど
テストして1,000~111,000にしか対応していないことに気づき
ちょっと修正した。

str.gsub!(/(.*\d)(\d\d\d)/, '\1,\2')

あと、メソッドに追加していたのはFixnumにだったけど
数が大きくなるとBignumになるので対応できないことにも気づく。

なので上位クラスのIntegerに追加することで解決。