TaKesso's Tech Blog

Web中心の技術メモ

Ruby: 2進数/8進数/16進数

REx - Ruby Examination で解いた問題の解説を自分なりにまとめ直すシリーズです。

問題

エラーが発生するのはどれですか

選択肢

  1. puts "0x90".hex
  2. puts '90'
  3. puts 0b2
  4. puts '80'.oct

解答

正解は [3] です

解説

数値のプレフィックス

num = 0d1234       // 10進数 (0dで始まる数値は10進数とみなされる)
num = 0xffff       // 16進数 (0xで始まる数値は16進数とみなされる)
num = 0o777        //  8進数 (0oで始まる数値は 8進数とみなされる)
num = 0b11000100   //  2進数 (0bで始まる数値は 2進数とみなされる)

引用: Ruby入門 - 数値・文字列・型

文字列を数値変換するメソッド

  • Stringクラス
    • .hex: 16進数の文字列表現とみなして、10進数の整数に変換する
    • .oct: 8進数の文字列表現とみなして、   〃
      • oct は文字列のプレフィックスに応じて 8 進以外の変換も行います。
      • p "0b10".oct # => 2
      • p "0x10".oct # => 16
    • .to_i: 10進数の文字列表現とみなして、   〃
    • .to_f: 10進数の文字列表現とみなして、10進数の浮動小数点数 Float に変換する
  • Kernelモジュール
    • Integer(): 引数を整数に変換した結果を返します
    • Float(): 引数を浮動小数点数 Float に変換した結果を返します

参考,引用: class String (Ruby 2.5.0)

実際の実行結果

irb(main):001:0> puts "0x90".hex
144
=> nil
irb(main):002:0> puts '90'
90
=> nil
irb(main):003:0> puts 0b2
SyntaxError: (irb):3: numeric literal without digits
puts 0b2
       ^
        from /your/path/...
irb(main):004:0> puts '80'.oct
0
=> nil