Rubyで文字列と数値を相互変換する(2進、8進、10進、16進数)
タグ: ruby / 初版公開: 2014-08-25

Rubyで文字列を数値に変換するにはString#to_iを使うと便利だ。 …ということはRubyを使ったことがある人なら誰でも知っていると思う。

だが実はString#to_iは引数に基数を指定することができ、10進数以外の文字列も数値に変換することができる。

p "11111111".to_i(2) #=> 255
p "377".to_i(8) #=> 255
p "255".to_i(10) #=> 255
p "FF".to_i(16) #=> 255

文字列の先頭に0b0xなど基数を表す接頭子が付いている場合は、KernelIntegerを使うことで文字列を数値に変換することができる。

p Integer("0b11111111") #=> 255
p Integer("0377") #=> 255
p Integer("255") #=> 255
p Integer("0xFF") #=> 255

逆に数値を文字列に変換する場合はInteger#to_sを使う。こちらもString#to_iと同様に引数に基数を指定することができる。

p 255.to_s(2) #=> "11111111"
p 255.to_s(8) #=> "377"
p 255.to_s(10) #=> "255"
p 255.to_s(16) #=> "ff"

0b0xなど接頭子が付いた文字列が必要な場合は、kernelsprintfを使うのが簡単だ。以下のようにして2進、8進数、10進数、16進数の文字列を得る。

p sprintf("%#b", 255) #=> "0b11111111"
p sprintf("%#o", 255) #=> "0377"
p sprintf("%#d", 255) #=> "255"
p sprintf("%#x", 255) #=> "0xff"

sprintfString#%として書くこともできる。ただこれ、%sprintfというのが直感的でなく、可読性があまり良いとは思えないので、個人的には好きではない。

p "%#b" % 255 #=> "0b11111111"
p "%#o" % 255 #=> "0377"
p "%#d" % 255 #=> "255"
p "%#x" % 255 #=> "0xff"

String#%sprintfなので(2項演算子なので配列で渡す必要があるが)複数の引数を取ることもできる。極端な例だが、こんなのぱっと見で意味がわからないのではないか。

p "%#b %#o %#d %#x" % [2, 4, 8, 16] #=> "0b10 04 8 0x10"