module ActiveObject::Numeric

Public Instance Methods

add(num) click to toggle source
# File lib/active_object/numeric.rb, line 64
def add(num)
  self + num
end
byte_in_bytes()
Alias for: bytes_in_bytes
bytes_in_bytes() click to toggle source
# File lib/active_object/numeric.rb, line 68
def bytes_in_bytes
  self
end
Also aliased as: byte_in_bytes
centigram_in_grams()
Alias for: centigrams_in_grams
centigrams_in_grams() click to toggle source
# File lib/active_object/numeric.rb, line 74
def centigrams_in_grams
  self * CENTI
end
Also aliased as: centigram_in_grams
centimeter_in_meters()
centimeters_in_meters() click to toggle source
# File lib/active_object/numeric.rb, line 80
def centimeters_in_meters
  self * CENTI
end
Also aliased as: centimeter_in_meters
centuries_in_seconds() click to toggle source
# File lib/active_object/numeric.rb, line 86
def centuries_in_seconds
  self * CENTURY
end
Also aliased as: century_in_seconds
century_in_seconds()
clamp(minimum, maximum = nil) click to toggle source

rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity

# File lib/active_object/numeric.rb, line 93
def clamp(minimum, maximum = nil)
  if maximum.nil? && minimum.is_a?(Range)
    min_min = minimum.min
    min_max = minimum.max

    return min_min if min_min > self

    min_max < self ? min_max : self
  else
    return minimum if minimum > self

    maximum < self ? maximum : self
  end
end
day_in_seconds()
Alias for: days_in_seconds
days_in_seconds() click to toggle source

rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity

# File lib/active_object/numeric.rb, line 109
def days_in_seconds
  self * DAY
end
Also aliased as: day_in_seconds
decade_in_seconds()
Alias for: decades_in_seconds
decades_in_seconds() click to toggle source
# File lib/active_object/numeric.rb, line 115
def decades_in_seconds
  self * DECADE
end
Also aliased as: decade_in_seconds
decagram_in_grams()
Alias for: decagrams_in_grams
decagrams_in_grams() click to toggle source
# File lib/active_object/numeric.rb, line 121
def decagrams_in_grams
  self * DECA
end
Also aliased as: decagram_in_grams
decameter_in_meters()
decameters_in_meters() click to toggle source
# File lib/active_object/numeric.rb, line 127
def decameters_in_meters
  self * DECA
end
Also aliased as: decameter_in_meters
decigram_in_grams()
Alias for: decigrams_in_grams
decigrams_in_grams() click to toggle source
# File lib/active_object/numeric.rb, line 133
def decigrams_in_grams
  self * DECI
end
Also aliased as: decigram_in_grams
decimeter_in_meters()
decimeters_in_meters() click to toggle source
# File lib/active_object/numeric.rb, line 139
def decimeters_in_meters
  self * DECI
end
Also aliased as: decimeter_in_meters
decrement(amount = 1.0) click to toggle source
# File lib/active_object/numeric.rb, line 145
def decrement(amount = 1.0)
  self + amount
end
degree_to_radians()
Alias for: degrees_to_radians
degrees_to_radians() click to toggle source
# File lib/active_object/numeric.rb, line 149
def degrees_to_radians
  self * ::Math::PI / 180.0
end
Also aliased as: degree_to_radians
distance(num) click to toggle source
# File lib/active_object/numeric.rb, line 155
def distance(num)
  (self - num).abs
end
divide(num) click to toggle source
# File lib/active_object/numeric.rb, line 159
def divide(num)
  return 0 if num.zero?

  self / num
end
exabyte_in_bytes()
Alias for: exabytes_in_bytes
exabytes_in_bytes() click to toggle source
# File lib/active_object/numeric.rb, line 165
def exabytes_in_bytes
  self * EXABYTE
end
Also aliased as: exabyte_in_bytes
feet_in_inches() click to toggle source
# File lib/active_object/numeric.rb, line 171
def feet_in_inches
  self * FEET
end
Also aliased as: foot_in_inches
foot_in_inches()
Alias for: feet_in_inches
fraction() click to toggle source
# File lib/active_object/numeric.rb, line 177
def fraction
  (self - truncate).abs
end
fraction?() click to toggle source
# File lib/active_object/numeric.rb, line 181
def fraction?
  fraction != 0.0
end
gigabyte_in_bytes()
Alias for: gigabytes_in_bytes
gigabytes_in_bytes() click to toggle source
# File lib/active_object/numeric.rb, line 185
def gigabytes_in_bytes
  self * GIGABYTE
end
Also aliased as: gigabyte_in_bytes
gram_in_grams()
Alias for: grams_in_grams
grams_in_grams() click to toggle source
# File lib/active_object/numeric.rb, line 191
def grams_in_grams
  self
end
Also aliased as: gram_in_grams
greater_than?(num) click to toggle source
# File lib/active_object/numeric.rb, line 197
def greater_than?(num)
  num < self
end
greater_than_or_equal_to?(num) click to toggle source
# File lib/active_object/numeric.rb, line 201
def greater_than_or_equal_to?(num)
  num <= self
end
hectogram_in_grams()
Alias for: hectograms_in_grams
hectograms_in_grams() click to toggle source
# File lib/active_object/numeric.rb, line 205
def hectograms_in_grams
  self * HECTO
end
Also aliased as: hectogram_in_grams
hectometer_in_meters()
hectometers_in_meters() click to toggle source
# File lib/active_object/numeric.rb, line 211
def hectometers_in_meters
  self * HECTO
end
Also aliased as: hectometer_in_meters
hour_in_seconds()
Alias for: hours_in_seconds
hours_in_seconds() click to toggle source
# File lib/active_object/numeric.rb, line 217
def hours_in_seconds
  self * HOUR
end
Also aliased as: hour_in_seconds
inch_in_inches()
Alias for: inches_in_inches
inches_in_inches() click to toggle source
# File lib/active_object/numeric.rb, line 223
def inches_in_inches
  self
end
Also aliased as: inch_in_inches
increment(amount = 1.0) click to toggle source
# File lib/active_object/numeric.rb, line 229
def increment(amount = 1.0)
  self + amount
end
inside?(start, finish) click to toggle source
# File lib/active_object/numeric.rb, line 233
def inside?(start, finish)
  (start < self) && (finish > self)
end
kilobyte_in_bytes()
Alias for: kilobytes_in_bytes
kilobytes_in_bytes() click to toggle source
# File lib/active_object/numeric.rb, line 237
def kilobytes_in_bytes
  self * KILOBYTE
end
Also aliased as: kilobyte_in_bytes
kilogram_in_grams()
Alias for: kilograms_in_grams
kilograms_in_grams() click to toggle source
# File lib/active_object/numeric.rb, line 249
def kilograms_in_grams
  self * KILO
end
Also aliased as: kilogram_in_grams
kilometer_in_meters()
kilometers_in_meters() click to toggle source
# File lib/active_object/numeric.rb, line 243
def kilometers_in_meters
  self * KILO
end
Also aliased as: kilometer_in_meters
less_than?(num) click to toggle source
# File lib/active_object/numeric.rb, line 255
def less_than?(num)
  num > self
end
less_than_or_equal_to?(num) click to toggle source
# File lib/active_object/numeric.rb, line 259
def less_than_or_equal_to?(num)
  num >= self
end
megabyte_in_bytes()
Alias for: megabytes_in_bytes
megabytes_in_bytes() click to toggle source
# File lib/active_object/numeric.rb, line 269
def megabytes_in_bytes
  self * MEGABYTE
end
Also aliased as: megabyte_in_bytes
meter_in_meters()
Alias for: meters_in_meters
meters_in_meters() click to toggle source
# File lib/active_object/numeric.rb, line 275
def meters_in_meters
  self
end
Also aliased as: meter_in_meters
metric_ton_in_grams()
metric_tons_in_grams() click to toggle source
# File lib/active_object/numeric.rb, line 263
def metric_tons_in_grams
  self * METRIC_TON
end
Also aliased as: metric_ton_in_grams
mile_in_inches()
Alias for: miles_in_inches
miles_in_inches() click to toggle source
# File lib/active_object/numeric.rb, line 281
def miles_in_inches
  self * MILE
end
Also aliased as: mile_in_inches
millennium_in_seconds()
millenniums_in_seconds() click to toggle source
# File lib/active_object/numeric.rb, line 287
def millenniums_in_seconds
  self * MILLENNIUM
end
Also aliased as: millennium_in_seconds
milligram_in_grams()
Alias for: milligrams_in_grams
milligrams_in_grams() click to toggle source
# File lib/active_object/numeric.rb, line 293
def milligrams_in_grams
  self * MILLI
end
Also aliased as: milligram_in_grams
millimeter_in_meters()
millimeters_in_meters() click to toggle source
# File lib/active_object/numeric.rb, line 299
def millimeters_in_meters
  self * MILLI
end
Also aliased as: millimeter_in_meters
minute_in_seconds()
Alias for: minutes_in_seconds
minutes_in_seconds() click to toggle source
# File lib/active_object/numeric.rb, line 305
def minutes_in_seconds
  self * MINUTE
end
Also aliased as: minute_in_seconds
multiple_of?(number) click to toggle source
# File lib/active_object/numeric.rb, line 315
def multiple_of?(number)
  return zero? if number.zero?

  modulo(number).zero?
end
multiply(num) click to toggle source
# File lib/active_object/numeric.rb, line 311
def multiply(num)
  self * num
end
nautical_mile_in_inches()
nautical_miles_in_inches() click to toggle source
# File lib/active_object/numeric.rb, line 321
def nautical_miles_in_inches
  self * NAUTICAL_MILE
end
Also aliased as: nautical_mile_in_inches
negative?() click to toggle source

rubocop:disable Style/NumericPredicate, Style/YodaCondition

# File lib/active_object/numeric.rb, line 328
def negative?
  0 > self
end
ordinal() click to toggle source

rubocop:enable Style/NumericPredicate, Style/YodaCondition

# File lib/active_object/numeric.rb, line 333
def ordinal
  return 'th' if (11..13).cover?(abs % 100)

  case abs % 10
  when 1 then 'st'
  when 2 then 'nd'
  when 3 then 'rd'
  else 'th'
  end
end
ordinalize() click to toggle source
# File lib/active_object/numeric.rb, line 344
def ordinalize
  "#{self}#{ordinal}"
end
ounce_in_ounces()
Alias for: ounces_in_ounces
ounces_in_ounces() click to toggle source
# File lib/active_object/numeric.rb, line 348
def ounces_in_ounces
  self
end
Also aliased as: ounce_in_ounces
outside?(start, finish) click to toggle source
# File lib/active_object/numeric.rb, line 354
def outside?(start, finish)
  (start > self) || (finish < self)
end
pad(options = {}) click to toggle source
# File lib/active_object/numeric.rb, line 358
def pad(options = {})
  pad_number = options[:pad_number] || 0
  precision = options[:precision] || 3

  to_s.rjust(precision, pad_number.to_s)
end
pad_precision(options = {}) click to toggle source

rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/LineLength, Metrics/MethodLength, Metrics/PerceivedComplexity

# File lib/active_object/numeric.rb, line 366
def pad_precision(options = {})
  pad_number = options[:pad_number] || 0
  precision = options[:precision] || 2
  separator = options[:separator] || '.'
  string = to_s

  string << separator unless string.include?(separator)
  ljust_count = string.split(separator).first.length
  ljust_count += (string.count(separator) + precision) if precision.positive?

  if ljust_count >= string.length
    string.ljust(ljust_count, pad_number.to_s)
  else
    string[0..(ljust_count - 1)]
  end
end
percentage_of(number) click to toggle source

rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/LineLength, Metrics/MethodLength, Metrics/PerceivedComplexity

# File lib/active_object/numeric.rb, line 384
def percentage_of(number)
  return 0 if zero? || number.zero?

  (to_f / number.to_f) * 100.0
end
petabyte_in_bytes()
Alias for: petabytes_in_bytes
petabytes_in_bytes() click to toggle source
# File lib/active_object/numeric.rb, line 390
def petabytes_in_bytes
  self * PETABYTE
end
Also aliased as: petabyte_in_bytes
positive?() click to toggle source

rubocop:disable Style/NumericPredicate, Style/YodaCondition

# File lib/active_object/numeric.rb, line 397
def positive?
  0 < self
end
pound_in_ounces()
Alias for: pounds_in_ounces
pounds_in_ounces() click to toggle source

rubocop:enable Style/NumericPredicate, Style/YodaCondition

# File lib/active_object/numeric.rb, line 402
def pounds_in_ounces
  self * POUND
end
Also aliased as: pound_in_ounces
power(num) click to toggle source
# File lib/active_object/numeric.rb, line 408
def power(num)
  self**num
end
root(num) click to toggle source
# File lib/active_object/numeric.rb, line 412
def root(num)
  self**(1.0 / num)
end
second_in_seconds()
Alias for: seconds_in_seconds
seconds_in_seconds() click to toggle source
# File lib/active_object/numeric.rb, line 416
def seconds_in_seconds
  self
end
Also aliased as: second_in_seconds
stone_in_ounces()
Alias for: stones_in_ounces
stones_in_ounces() click to toggle source
# File lib/active_object/numeric.rb, line 422
def stones_in_ounces
  self * STONE
end
Also aliased as: stone_in_ounces
subtract(num) click to toggle source
# File lib/active_object/numeric.rb, line 428
def subtract(num)
  self - num
end
terabyte_in_bytes()
Alias for: terabytes_in_bytes
terabytes_in_bytes() click to toggle source
# File lib/active_object/numeric.rb, line 432
def terabytes_in_bytes
  self * TERABYTE
end
Also aliased as: terabyte_in_bytes
to_byte(from, to) click to toggle source
# File lib/active_object/numeric.rb, line 438
def to_byte(from, to)
  assert_inclusion_of_valid_keys!(BYTE_KEYS, from, to)

  to_f * 1.send("#{from}_in_bytes").to_f / 1.send("#{to}_in_bytes").to_f
end
to_currency(options = {}) click to toggle source
# File lib/active_object/numeric.rb, line 444
def to_currency(options = {})
  unit = options[:unit] || '$'

  "#{unit}#{pad_precision(options.only(:precision))}"
end
to_length(from, to) click to toggle source

rubocop:disable Metrics/AbcSize, Metrics/MethodLength

# File lib/active_object/numeric.rb, line 451
def to_length(from, to)
  assert_inclusion_of_valid_keys!(LENGTH_KEYS.values.flatten, from, to)

  return self if from == to

  metric_keys = LENGTH_KEYS.fetch(:metric)
  metrics_included_from = metric_keys.include?(from)

  case to
  when :meter, :meters, :millimeter, :millimeters, :centimeter, :centimeters, :decimeter,
       :decimeters, :decameter, :decameters, :hectometer, :hectometers, :kilometer, :kilometers
    if metrics_included_from
      to_f * 1.send("#{from}_in_meters").to_f / 1.send("#{to}_in_meters").to_f
    else
      to_f * ((1.send("#{from}_in_inches").to_f * 0.0254) / 1.send("#{to}_in_meters").to_f)
    end
  when :inch, :inches, :foot, :feet, :yard, :yards, :mile, :miles, :nautical_mile,
       :nautical_miles
    if metrics_included_from
      to_f * ((1.send("#{from}_in_meters").to_f * 39.3701) / 1.send("#{to}_in_inches").to_f)
    else
      to_f * 1.send("#{from}_in_inches").to_f / 1.send("#{to}_in_inches").to_f
    end
  end
end
to_mass(from, to) click to toggle source
# File lib/active_object/numeric.rb, line 477
def to_mass(from, to)
  assert_inclusion_of_valid_keys!(MASS_KEYS.values.flatten, from, to)

  return self if from == to

  metric_keys = MASS_KEYS.fetch(:metric)
  metrics_included_from = metric_keys.include?(from)

  case to
  when :gram, :grams, :milligram, :milligrams, :centigram, :centigrams, :decigram, :decigrams,
       :decagram, :decagrams, :hectogram, :hectograms, :kilogram, :kilograms, :metric_ton,
       :metric_tons
    if metrics_included_from
      to_f * 1.send("#{from}_in_grams").to_f / 1.send("#{to}_in_grams").to_f
    else
      to_f * ((1.send("#{from}_in_ounces") * 28.3495).to_f / 1.send("#{to}_in_grams").to_f)
    end
  when :ounce, :ounces, :pound, :pounds, :stone, :stones, :ton, :tons
    if metrics_included_from
      to_f * ((1.send("#{from}_in_grams") * 0.035274).to_f / 1.send("#{to}_in_ounces").to_f)
    else
      to_f * 1.send("#{from}_in_ounces").to_f / 1.send("#{to}_in_ounces").to_f
    end
  end
end
to_nearest_value(values = []) click to toggle source

rubocop:enable Metrics/AbcSize, Metrics/MethodLength

# File lib/active_object/numeric.rb, line 504
def to_nearest_value(values = [])
  return self if values.length.zero?

  value = values.first
  difference = (self - value).abs

  values.each do |val|
    next unless (self - val).abs < difference

    difference = (self - val).abs
    value = val
  end

  value
end
to_percentage(options = {}) click to toggle source
# File lib/active_object/numeric.rb, line 520
def to_percentage(options = {})
  unit = options[:unit] || '%'

  "#{pad_precision(options.only(:precision))}#{unit}"
end
to_temperature(from, to) click to toggle source

rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength

# File lib/active_object/numeric.rb, line 527
def to_temperature(from, to)
  assert_inclusion_of_valid_keys!(TEMPERATURE_KEYS, from, to)

  case to
  when from
    self
  when :celsius
    from == :kelvin ? (self - 273.15) : ((self - 32.0) * 5.0 / 9.0)
  when :fahrenheit
    from == :kelvin ? (1.8 * (self - 273.15) + 32.0) : ((self * 9.0 / 5.0) + 32.0)
  when :kelvin
    from == :celsius ? (self + 273.15) : (((self - 32.0) * 5.0 / 9.0) + 273.15)
  end
end
to_time(from, to) click to toggle source

rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength

# File lib/active_object/numeric.rb, line 543
def to_time(from, to)
  assert_inclusion_of_valid_keys!(TIME_KEYS, from, to)

  (to_f * 1.send("#{from}_in_seconds").to_f) / 1.send("#{to}_in_seconds").to_f
end
ton_in_ounces()
Alias for: tons_in_ounces
tons_in_ounces() click to toggle source
# File lib/active_object/numeric.rb, line 549
def tons_in_ounces
  self * TON
end
Also aliased as: ton_in_ounces
week_in_seconds()
Alias for: weeks_in_seconds
weeks_in_seconds() click to toggle source
# File lib/active_object/numeric.rb, line 555
def weeks_in_seconds
  self * WEEK
end
Also aliased as: week_in_seconds
within?(number, epsilon = 0.01) click to toggle source
# File lib/active_object/numeric.rb, line 561
def within?(number, epsilon = 0.01)
  return number == self if epsilon.zero?

  alpha = to_f
  beta = number.to_f

  if alpha.zero? || beta.zero?
    (alpha - beta).abs < epsilon
  else
    (alpha / beta - 1).abs < epsilon
  end
end
yard_in_inches()
Alias for: yards_in_inches
yards_in_inches() click to toggle source
# File lib/active_object/numeric.rb, line 574
def yards_in_inches
  self * YARD
end
Also aliased as: yard_in_inches
year_in_seconds()
Alias for: years_in_seconds
years_in_seconds() click to toggle source
# File lib/active_object/numeric.rb, line 580
def years_in_seconds
  self * YEAR
end
Also aliased as: year_in_seconds

Private Instance Methods

assert_inclusion_of_valid_keys!(cns, from, to) click to toggle source
# File lib/active_object/numeric.rb, line 588
def assert_inclusion_of_valid_keys!(cns, from, to)
  return if cns.include?(from) && cns.include?(to)

  raise ArgumentError,
        [
          "Unknown key(s): from: #{from.inspect} and to: #{to.inspect}.",
          "Valid keys are: #{cns.map(&:inspect).join(', ')}"
        ].join(' ')
end