数字を数値に変換

C 言語のヘッダファイルをパースして、特定の define 文から Hash に変換するという地味な作業をしていた。

C 言語では、数字の前に 0x が付いていれば 16 進数。数字の前に 0 が付いていれば 8 進数という意味になる。
この数値リテラルのルールは Ruby でも一緒。

この地味な作業の最中にふと思った。
8 進数, 10 進数, 16 進数の文字列を簡単に数値に変換する方法はないものか。

C 言語でも Ruby でも同じ記法なら eval でできるか?

str = ["16", "020", "0x10"]
str.map{|s| eval s}             # => [16, 16, 16]

できた。
でも流石にこれは不採用。

いろいろやってるうちに、String#% が意外な結果を返すことに気付いた。

str = ["16", "020", "0x10"]
str.map{|s| "%d" % s}           # => ["16", "16", "16"]

C 言語脳で考えると SEGV 起こしそうだけど、Ruby では適切な型変換が行なわれている模様。

そこで「るりま」を見てみると、こんなことが書いてあった。

引数が整数でなければ関数 Kernel.#Integer と同じ規則で整数に変換されます。

早速やってみる。

str = ["16", "020", "0x10"]
str.map{|s| Integer(s)}         # => [16, 16, 16]

なんだ難しいことしなくても、これで良かったのか。

それにしても「るりま」はすばらしい。感謝。