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
文字列の先頭に0b
や0x
など基数を表す接頭子が付いている場合は、Kernel
のInteger
を使うことで文字列を数値に変換することができる。
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"
0b
や0x
など接頭子が付いた文字列が必要な場合は、kernel
のsprintf
を使うのが簡単だ。以下のようにして2進、8進数、10進数、16進数の文字列を得る。
p sprintf("%#b", 255) #=> "0b11111111"
p sprintf("%#o", 255) #=> "0377"
p sprintf("%#d", 255) #=> "255"
p sprintf("%#x", 255) #=> "0xff"
sprintf
はString#%
として書くこともできる。ただこれ、%
が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"