n進数から 10進数へ(Ruby)

Ruby で 10進数を n進数に直すのは int.to_s で出来ます。しかし、その逆(n進数から 10進数へ)ができるかわからなかったので、メソッドを作ってみました。ただし、n は 2 から 10 までです。アルファベットを使って、36進数まで出来ないことはないですが、とりあえず。なお、不具合があると nil を返します。

#n進数のi(String)を10進数に変換する。ただしnは2から10。
def dec(i, n)
  return nil if n < 2 or n > 10
  x = 0
  for j in 0..(i.length - 1)
    return nil unless (a = i[-(j + 1)]).between?("0", "9")
    return nil if (b = a.to_i) >= n
    x += (n ** j) * b
  end
  x
rescue
  nil
end

p dec("203", 5)   #=>53


ありゃ、String#to_i(n) で標準実装されていました。それも、n は 36進数までちゃんとサポートされています。抜かりがないなあ。

 "203".to_i(5)    #=>53

これで、n進数の計算もできますね。例えば 2進数で 1011 + 100101 は、次のように計算できます。

("1011".to_i(2) + "100101".to_i(2)).to_s(2)   #=>"110000"

見た目があまりきれいではないですが。


※追記(2017/12/1)
2進数で 1011 + 100101 はこうですね。2進数リテラルがあるわけです。無知でした。

sprintf("%0b", 0b1011 + 0b100101)    #=>"110000"

ただし、もちろん n進数リテラルがあるわけではないので、5進数とかなら元記事のようにやればいいです。