Friday, July 23, 2010

conv.rb

to_s(base), to_i(base)を94まで対応

#!/usr/local/bin/ruby
# -*- encoding:utf-8 -*-
module Conv
  TABLE = ('!'..'~').to_a

  def to_s_conv(base, rs=[])
   q, r = self.divmod base
   rs.unshift TABLE[r]
   q.to_s_conv(base, rs) if q > 0
   rs.join
  end

  def to_i_conv(base)
    self.split(//).reverse.map.with_index { |s, i| TABLE.index(s).to_i * base**i }.inject(:+)
  end
end

class Fixnum
  include Conv
  alias to_s_orig to_s
  def to_s(base=10)
    base > 36 ? to_s_conv(base) : to_s_orig(base)
  end
end

class Bignum
  include Conv
  alias to_s_orig to_s
  def to_s(base=10)
    base > 36 ? to_s_conv(base) : to_s_orig(base)
  end
end

class String
  include Conv
  alias to_i_orig to_i
  def to_i(base=10)
    base > 36 ? to_i_conv(base) : to_i_orig(base)
  end
end

x = 200_000_000_000
(2..94).each do |i|
  s = x.to_s(i)
  print "#{i} => #{s}:#{s.to_i(i)}\n"
end


 

No comments: