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