Project

General

Profile

Feature #8850

Convert Rational to decimal string

Added by naruse (Yui NARUSE) over 4 years ago. Updated 4 months ago.

Status:
Assigned
Priority:
Normal
Target version:
-
[ruby-core:56955]

Description

On Ruby 2.1.0, decimal literal is introduced.
It generates Rational but it cannot easily convert to decimal string.
You know, Rational#to_f is related to this but

  • Float is not exact number ** 0.123456789123456789r.to_f.to_s #=> "0.12345678912345678"
  • it can't handle recursive decimal
    ** (151/13r).to_f.to_s #=> "11.615384615384615"

  • the method name
    ** to_decimal
    ** to_decimal_string
    ** to_s(format: :decimal)
    ** extend sprintf

  • how does it express recursive decimal
    ** (151/13r).to_decimal_string #=> "11.615384..."
    ** (151/13r).to_decimal_string #=> "11.(615384)"

Example implementation is following.
Its result is
** 0.123456789123456789r.to_f.to_s #=> "0.123456789123456789"
** (151/13r).to_f.to_s #=> "11.(615384)"

class Rational
  def to_decimal_string(base=10)
    n = numerator
    d = denominator
    r, n = n.divmod d
    str = r.to_s(base)
    return str if n == 0
    h = {}
    str << '.'
    n *= base
    str.size.upto(Float::INFINITY) do |i|
      r, n = n.divmod d
      if n == 0
        str << r.to_s(base)
        break
      elsif h.key? n
        str[h[n], 0] = '('
        str << ')'
        break
      else
        str << r.to_s(base)
        h[n] = i
        n *= base
      end
    end
    str
  end
end

History

#1 [ruby-core:56973] Updated by Anonymous over 4 years ago

How about to_s( :decimal ) ?

#2 [ruby-core:60723] Updated by nobu (Nobuyoshi Nakada) about 4 years ago

  • Description updated (diff)

#3 [ruby-core:60724] Updated by shyouhei (Shyouhei Urabe) about 4 years ago

  • Status changed from Assigned to Feedback

Can anyone propose a patch please?

#5 [ruby-core:60781] Updated by mrkn (Kenta Murata) about 4 years ago

  • Status changed from Feedback to Assigned

#8 Updated by naruse (Yui NARUSE) 4 months ago

  • Target version deleted (2.6)

Also available in: Atom PDF