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


出力はこんな感じ。

どうでもいいけど、昼飯代に指数表記が出てくるとは思わなかったな。