Class: ActiveSupport::NumberHelper::NumberToRoundedConverter

Inherits:
NumberConverter show all
Defined in:
lib/active_support/number_helper/number_to_rounded_converter.rb

Overview

:nodoc:

Constant Summary

Constants inherited from NumberConverter

ActiveSupport::NumberHelper::NumberConverter::DEFAULTS

Instance Attribute Summary

Attributes inherited from NumberConverter

#number, #opts

Instance Method Summary collapse

Methods inherited from NumberConverter

convert, #execute, #initialize

Constructor Details

This class inherits a constructor from ActiveSupport::NumberHelper::NumberConverter

Instance Method Details

#convertObject



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/active_support/number_helper/number_to_rounded_converter.rb', line 7

def convert
  precision = options.delete :precision
  significant = options.delete :significant

  case number
  when Float, String
    @number = BigDecimal(number.to_s)
  when Rational
    if significant
      @number = BigDecimal(number, digit_count(number.to_i) + precision)
    else
      @number = BigDecimal(number, precision)
    end
  else
    @number = number.to_d
  end

  if significant && precision > 0
    digits, rounded_number = digits_and_rounded_number(precision)
    precision -= digits
    precision = 0 if precision < 0 # don't let it be negative
  else
    rounded_number = number.round(precision)
    rounded_number = rounded_number.to_i if precision == 0
    rounded_number = rounded_number.abs if rounded_number.zero? # prevent showing negative zeros
  end

  formatted_string =
    if BigDecimal === rounded_number && rounded_number.finite?
      s = rounded_number.to_s('F') + '0'*precision
      a, b = s.split('.', 2)
      a + '.' + b[0, precision]
    else
      "%01.#{precision}f" % rounded_number
    end

  delimited_number = NumberToDelimitedConverter.convert(formatted_string, options)
  format_number(delimited_number)
end