バリケンのRuby日記 RSSフィード

2006-06-21

[] QuickMLソースコードを読む(14) /usr/lib/ruby/1.8/quickml/utils.rbの続き  QuickMLのソースコードを読む(14) /usr/lib/ruby/1.8/quickml/utils.rbの続き - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  QuickMLのソースコードを読む(14) /usr/lib/ruby/1.8/quickml/utils.rbの続き - バリケンのRuby日記  QuickMLのソースコードを読む(14) /usr/lib/ruby/1.8/quickml/utils.rbの続き - バリケンのRuby日記 のブックマークコメント

昨日の日記の続きだよ。

Integer#commifyメソッド

class Integer
  # commify(12345) => "12,345"
  def commify
    numstr = self.to_s
    true while numstr.sub!(/^([-+]?\d+)(\d{3})/, '\1,\2')
    return numstr
  end
end

これは、Integer#commifyメソッドの定義だね。整数を3桁ごとにカンマで区切った文字列を返すよ。

まず、Integer#to_sメソッドで整数から文字列オブジェクトを生成して、numstrというラベルを貼るよ。

次に、正規表現/^([-+]?\d+)(\d{3})/つまり「文字列の先頭の次にプラス記号またはマイナス記号のゼロまたは1回の繰り返しのあとに、数字1文字の1回以上の繰り返し」と「数字3文字」がそれぞれ「\1」と「\2」で後方参照されて、「,」を間に入れた文字列に破壊的に変更するよ。

true whileと書いてあるから、string#sub!メソッドが失敗するまで繰り返し実行されるよ。つまり、3文字以上の整数文字が並んでいる限り繰り返されるから、結果的に整数を3桁ごとにカンマで区切るという動作になるんだね。

今日はここまで。ようやく/usr/lib/ruby/1.8/quickml/utils.rbを読み終えたけど、ゆっくり読んでいたらずいぶん時間がかかっちゃったね。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20060621