HpricotとMeasureを使って今日の昼飯代をジンバブエドルで表示する
ジンバブエドルがちょっと凄いことになっていると連日目にするので、実際のところどのくらい凄いのかRubyで計算してみた。昼飯代とかジンバブエドルに換算するとリッチな気分になれるかも。
為替レートは毎日変わるのでウェブサイトから取ってきたい。
ジンバブエドルはここから。 http://zimbabweanequities.com/
日本円はYahoo!でいいや。http://quote.yahoo.co.jp/q?s=USDJPY=X&d=t
ウェブの情報を読むのでHpricotを使うと良いのかな。入れてみよう。
> gem install hpricot
なんかHpricotでエラーが出る。バッファサイズを設定すると良いらしい。
# ran out of buffer space エラーが出るのでバッファサイズ拡張 Hpricot.buffer_size = 100000
ジンバブエドルのページにあるレートの数値は<span id="Label_roe">が目印になるから (doc/"#Label_roe").inner_html で取得できる。カンマ区切りになってるので gsub(/,/,"") でカンマを削除してから数値変換。
ZWD_rate = (doc/"#Label_roe").inner_html.gsub(/,/,"").to_f
日本円のページはIDとか無くて扱いにくい。いまいち不安だけど、テーブル内の最初の太文字ということで (doc/"//table/tr/td/b").first でいいか。
Yen_rate = (doc/"//table/tr/td/b").first.inner_html.to_f
通貨を扱うには、先日札幌Ruby会議01で話を聴いたMeasureを使うと面白そう。
> gem install measure
こんな感じでMeasureに換算式を教えてあげれば単位を考慮した変換や表示を勝手にやってくれる。便利。
Measure.define_conversion :USD, :ZWD => ZWD_rate
(ZWD_rateはさっき取得した数値で11851630480952とかが入ってる。ていうか、なんだこのレートは)
できた。
#!/usr/bin/ruby require 'rubygems' require 'measure' require 'measure/support' require 'hpricot' require 'open-uri' # ran out of buffer space エラーが出るのでバッファサイズ拡張 Hpricot.buffer_size = 100000 # 為替レート取得 doc = Hpricot(open("http://zimbabweanequities.com/")) ZWD_rate = (doc/"#Label_roe").inner_html.gsub(/,/,"").to_f doc = Hpricot(open("http://quote.yahoo.co.jp/q?s=USDJPY=X&d=t")) Yen_rate = (doc/"//table/tr/td/b").first.inner_html.to_f # Measureで << を使えるように定義 class Measure def to_str to_s end def <<(obj) to_str + obj.to_str end end # 通貨の定義 Measure.define_unit :Yen Measure.define_unit :USD Measure.define_unit :ZWD # レート設定 Measure.define_conversion :USD, :Yen => Yen_rate Measure.define_conversion :USD, :ZWD => ZWD_rate Measure.form do puts 1.USD << " = " << 1.USD.as_Yen puts 1.USD << " = " << 1.USD.as_ZWD puts "" puts "カレー " << 700.Yen.as_ZWD puts "コーヒー " << 300.Yen.as_ZWD puts "うまい棒 " << 10.Yen.as_ZWD puts "合計 " << (700.Yen + 300.Yen + 10.Yen).as_ZWD end
どうでもいいけど、昼飯代に指数表記が出てくるとは思わなかったな。