class ActiveSupport::NumberHelper::RoundingHelper

:nodoc:

def absolute_number(number)

def absolute_number(number)
  number.respond_to?(:abs) ? number.abs : number.to_d.abs
end

def convert_to_decimal(number)

def convert_to_decimal(number)
  case number
  when Float, String
    BigDecimal(number.to_s)
  when Rational
    BigDecimal(number, digit_count(number.to_i) + precision)
  else
    number.to_d
  end
end

def digit_count(number)

def digit_count(number)
  return 1 if number.zero?
  (Math.log10(absolute_number(number)) + 1).floor
end

def initialize(options)

def initialize(options)
  @options = options
end

def precision

def precision
  options[:precision]
end

def round(number)

def round(number)
  return number unless precision
  number = convert_to_decimal(number)
  if significant && precision > 0
    round_significant(number)
  else
    round_without_significant(number)
  end
end

def round_significant(number)

def round_significant(number)
  return 0 if number.zero?
  digits = digit_count(number)
  multiplier = 10**(digits - precision)
  (number / BigDecimal(multiplier.to_f.to_s)).round * multiplier
end

def round_without_significant(number)

def round_without_significant(number)
  number = number.round(precision)
  number = number.to_i if precision == 0 && number.finite?
  number = number.abs if number.zero? # prevent showing negative zeros
  number
end

def significant

def significant
  options[:significant]
end