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>'
とりあえず、問題なさそうなので良しとするか。。。