module ActiveObject::Numeric
Public Instance Methods
# File lib/active_object/numeric.rb, line 64 def add(num) self + num end
# File lib/active_object/numeric.rb, line 68 def bytes_in_bytes self end
# File lib/active_object/numeric.rb, line 74 def centigrams_in_grams self * CENTI end
# File lib/active_object/numeric.rb, line 80 def centimeters_in_meters self * CENTI end
# File lib/active_object/numeric.rb, line 86 def centuries_in_seconds self * CENTURY end
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
rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
# File lib/active_object/numeric.rb, line 109 def days_in_seconds self * DAY end
# File lib/active_object/numeric.rb, line 115 def decades_in_seconds self * DECADE end
# File lib/active_object/numeric.rb, line 121 def decagrams_in_grams self * DECA end
# File lib/active_object/numeric.rb, line 127 def decameters_in_meters self * DECA end
# File lib/active_object/numeric.rb, line 133 def decigrams_in_grams self * DECI end
# File lib/active_object/numeric.rb, line 139 def decimeters_in_meters self * DECI end
# File lib/active_object/numeric.rb, line 145 def decrement(amount = 1.0) self + amount end
# File lib/active_object/numeric.rb, line 149 def degrees_to_radians self * ::Math::PI / 180.0 end
# File lib/active_object/numeric.rb, line 155 def distance(num) (self - num).abs end
# File lib/active_object/numeric.rb, line 159 def divide(num) return 0 if num.zero? self / num end
# File lib/active_object/numeric.rb, line 165 def exabytes_in_bytes self * EXABYTE end
# File lib/active_object/numeric.rb, line 171 def feet_in_inches self * FEET end
# File lib/active_object/numeric.rb, line 177 def fraction (self - truncate).abs end
# File lib/active_object/numeric.rb, line 181 def fraction? fraction != 0.0 end
# File lib/active_object/numeric.rb, line 185 def gigabytes_in_bytes self * GIGABYTE end
# File lib/active_object/numeric.rb, line 191 def grams_in_grams self end
# File lib/active_object/numeric.rb, line 197 def greater_than?(num) num < self end
# File lib/active_object/numeric.rb, line 201 def greater_than_or_equal_to?(num) num <= self end
# File lib/active_object/numeric.rb, line 205 def hectograms_in_grams self * HECTO end
# File lib/active_object/numeric.rb, line 211 def hectometers_in_meters self * HECTO end
# File lib/active_object/numeric.rb, line 217 def hours_in_seconds self * HOUR end
# File lib/active_object/numeric.rb, line 223 def inches_in_inches self end
# File lib/active_object/numeric.rb, line 229 def increment(amount = 1.0) self + amount end
# File lib/active_object/numeric.rb, line 233 def inside?(start, finish) (start < self) && (finish > self) end
# File lib/active_object/numeric.rb, line 237 def kilobytes_in_bytes self * KILOBYTE end
# File lib/active_object/numeric.rb, line 249 def kilograms_in_grams self * KILO end
# File lib/active_object/numeric.rb, line 243 def kilometers_in_meters self * KILO end
# File lib/active_object/numeric.rb, line 255 def less_than?(num) num > self end
# File lib/active_object/numeric.rb, line 259 def less_than_or_equal_to?(num) num >= self end
# File lib/active_object/numeric.rb, line 269 def megabytes_in_bytes self * MEGABYTE end
# File lib/active_object/numeric.rb, line 275 def meters_in_meters self end
# File lib/active_object/numeric.rb, line 263 def metric_tons_in_grams self * METRIC_TON end
# File lib/active_object/numeric.rb, line 281 def miles_in_inches self * MILE end
# File lib/active_object/numeric.rb, line 287 def millenniums_in_seconds self * MILLENNIUM end
# File lib/active_object/numeric.rb, line 293 def milligrams_in_grams self * MILLI end
# File lib/active_object/numeric.rb, line 299 def millimeters_in_meters self * MILLI end
# File lib/active_object/numeric.rb, line 305 def minutes_in_seconds self * MINUTE end
# File lib/active_object/numeric.rb, line 315 def multiple_of?(number) return zero? if number.zero? modulo(number).zero? end
# File lib/active_object/numeric.rb, line 311 def multiply(num) self * num end
# File lib/active_object/numeric.rb, line 321 def nautical_miles_in_inches self * NAUTICAL_MILE end
rubocop:disable Style/NumericPredicate, Style/YodaCondition
# File lib/active_object/numeric.rb, line 328 def negative? 0 > self end
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
# File lib/active_object/numeric.rb, line 344 def ordinalize "#{self}#{ordinal}" end
# File lib/active_object/numeric.rb, line 348 def ounces_in_ounces self end
# File lib/active_object/numeric.rb, line 354 def outside?(start, finish) (start > self) || (finish < self) end
# 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
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
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
# File lib/active_object/numeric.rb, line 390 def petabytes_in_bytes self * PETABYTE end
rubocop:disable Style/NumericPredicate, Style/YodaCondition
# File lib/active_object/numeric.rb, line 397 def positive? 0 < self end
rubocop:enable Style/NumericPredicate, Style/YodaCondition
# File lib/active_object/numeric.rb, line 402 def pounds_in_ounces self * POUND end
# File lib/active_object/numeric.rb, line 408 def power(num) self**num end
# File lib/active_object/numeric.rb, line 412 def root(num) self**(1.0 / num) end
# File lib/active_object/numeric.rb, line 416 def seconds_in_seconds self end
# File lib/active_object/numeric.rb, line 422 def stones_in_ounces self * STONE end
# File lib/active_object/numeric.rb, line 428 def subtract(num) self - num end
# File lib/active_object/numeric.rb, line 432 def terabytes_in_bytes self * TERABYTE end
# 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
# File lib/active_object/numeric.rb, line 444 def to_currency(options = {}) unit = options[:unit] || '$' "#{unit}#{pad_precision(options.only(:precision))}" end
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
# 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
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
# File lib/active_object/numeric.rb, line 520 def to_percentage(options = {}) unit = options[:unit] || '%' "#{pad_precision(options.only(:precision))}#{unit}" end
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
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
# File lib/active_object/numeric.rb, line 549 def tons_in_ounces self * TON end
# File lib/active_object/numeric.rb, line 555 def weeks_in_seconds self * WEEK end
# 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
# File lib/active_object/numeric.rb, line 574 def yards_in_inches self * YARD end
# File lib/active_object/numeric.rb, line 580 def years_in_seconds self * YEAR end
Private Instance Methods
# 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