黒川仁の文具堂ブログ三昧

Hitoshi Kurokawa, an engineer at Next SeeD

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

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に追加することで解決。

関連記事

Comments:4

うえむら 09-07-27 (月) 13:58

rubyでプログラミングを学んでみよう、と試行錯誤している者です。3桁ごとにカンマをつけたくなって、検索で跳んできました。

-111.to_c とすると、反応が無くなり無限ループ(?)に陥っているように見えるのですが、符号に関しては正規表現の(.*\d)の部分でケアしているのでしょうか?この部分が何をしているのか判らなかったので、書き込ませて下さい。

黒川仁(文具堂) 09-07-27 (月) 14:38

うえむらさん
コメントありがとうございます。

マイナスのことは考えてなかったです。。。
おっしゃるとおりループに入ってしまいました。

記事を修正してみましたのでよければご参考にしてみてください。

うえむら 09-07-27 (月) 20:20

自分でも書き直してみたのですが、黒川さんの修正の方が判りやすく思われたので、参考にさせて頂きました。

因みに、def to_cの次の行の、str = to_sの部分を見て面食らってしまったのですが、Integerクラスのメソッドto_sを代入しているのでしょうか(?o?)

他にも興味深い記事が多そうなので、散策させて頂きますね。

黒川仁(文具堂) 09-07-27 (月) 21:54

なるほど、いわれてみれば変な感じもしますね。
普通に使ってたので気にならなかったです。

メソッドを代入ではなくメソッドが返す値(String)を代入していることになります。

その値が111なら111.to_sの値ということです。

self.to_sと書いた方が明示的でわかりやすいかもですね。

どうぞごゆるりと。

Comment Form
Remember personal info

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

Search
Feeds
Meta

Return to page top