class Pulo::NumberToRoundedConverter

Public Class Methods

convert(number, precision) click to toggle source
# File lib/pulo/formatting.rb, line 53
def self.convert(number, precision)

  precision ||= Pulo.precision

  if Pulo.significant_figures && precision > 0
    digits, rounded_number = digits_and_rounded_number(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 = "%00.#{precision}f" % rounded_number

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

Private Class Methods

absolute_number(number) click to toggle source
# File lib/pulo/formatting.rb, line 99
def self.absolute_number(number)
  number.respond_to?(:abs) ? number.abs : number.to_d.abs
end
calculate_rounded_number(number,multiplier) click to toggle source
# File lib/pulo/formatting.rb, line 86
def self.calculate_rounded_number(number,multiplier)
  (number / BigDecimal.new(multiplier.to_f.to_s)).round * multiplier
end
digit_count(number) click to toggle source
# File lib/pulo/formatting.rb, line 90
def self.digit_count(number)
  number.zero? ? 1 : (Math.log10(absolute_number(number)) + 1).floor
end
digits_and_rounded_number(number,precision) click to toggle source
# File lib/pulo/formatting.rb, line 74
def self.digits_and_rounded_number(number,precision)
  if zero?(number)
    [1, 0]
  else
    digits = digit_count(number)
    multiplier = 10 ** (digits - precision)
    rounded_number = calculate_rounded_number(number,multiplier)
    digits = digit_count(rounded_number) # After rounding, the number of digits may have changed
    [digits, rounded_number]
  end
end
format_number(number) click to toggle source
# File lib/pulo/formatting.rb, line 94
def self.format_number(number)
  escaped_separator = Regexp.escape('.')
  number.sub(/(#{escaped_separator})(\d*[1-9])?0+\z/, '\1\2').sub(/#{escaped_separator}\z/, '')
end
zero?(number) click to toggle source
# File lib/pulo/formatting.rb, line 103
def self.zero?(number)
  number.respond_to?(:zero?) ? number.zero? : number.to_d.zero?
end