Floatクラスで基数指定付きto_s

ちょっと必要だったので、小数も指定基数でto_sできるようにしてみた。
ただ、指定基数によっては無限小数になる場合があるので、第2引数でto_sの最大長を指定できるようにしてみた。

class Float
  alias :to_s10 :to_s
  def to_s(base=10, max=20)
    raise ArgumentError, "invalid radix #{base}" if base < 2 || base > 36
    return self.to_s10 if base == 10
    clone = self
    c = clone.to_i
    str = c.to_s(base)
    clone -= c
    if clone != 0
      str += '.'
      while clone != 0 && max > 0
        clone *= base
        c = clone.to_i
        str += c.to_s(36)
        clone -= c
        max -= 1
      end
    end
    str
  end
end

こんな感じで使えるはず。

irb(main):042:0* 3.1415926535.to_s(2)
=> "11.00100100001111110110"
irb(main):043:0> 
irb(main):044:0* 3.1415926535.to_s(3)
=> "10.01021101222201021100"
irb(main):045:0> 
irb(main):046:0* 3.1415926535.to_s(16)
=> "3.243f6a8822e88"
irb(main):047:0> 3.1415926535.to_s(36)
=> "3.53i5ab1nu1od65oswd6b"
irb(main):048:0> 3.1415926535.to_s(1)
ArgumentError: invalid radix 1
	from (irb):4:in `to_s'
	from (irb):48
	from /usr/local/ruby/bin/irb:12:in `<main>'

とりあえず、問題なさそうなので良しとするか。。。