module Rafini::Odometers
Constants
- SCALE
- SEC2TIME
Public Instance Methods
description()
click to toggle source
# File lib/rafini/odometers.rb, line 47 def description string = '' reverse_each do |key, count| s = (count==1)? '' : 's' unless string.empty? string << " and #{count} #{key}#{s}" if count > 0 break end next if count == 0 string << "#{count} #{key}#{s}" end return string end
illion(type=:short)
click to toggle source
1_230.illion.to_s #=> “1.23k” 1_230_000.illion.to_s #=> “1.23M” …etc Does both short and long scales, short by default. Returns a struct with the different scales of the number
m = 888_777_666_555_444_321.illion m.ones #=> 1 m.tens #=> 2 m.hundreds #=> 3 m.thousands #=> 444 m.millions #=> 555 m.billions #=> 666 m.trillions #=> 777 m.quadrillions #=> 888 m.to_s #=> "888Q" It rounds up 888.7!
# File lib/rafini/odometers.rb, line 116 def illion(type=:short) scale = SCALE[:base].merge SCALE[type] struct = odoread(scale, factors:false) do def scale=(scale) @scale=scale end def type=(type) @type=type end def to_s number = to_i return number.to_s if number < 1_000 if number < 1_000_000 precision = (number<10_000)? 2 : (number<100_000)? 1 : 0 return "#{(number/1000.0).round(precision)}K" end keys = @scale.keys.reverse_each loop do key = keys.next n = self[key] next if n == 0 if n < 1_000 precision = (n<10)? 2 : (n<100)? 1 : 0 scale = @scale[key].to_f f = (number/scale).round(precision) return "#{f}#{key[0].upcase}" end return "#{n.illion}#{key[0].upcase}" end end def to_i @scale.to_a.map{|k,v|v*self[k]}.sum end end struct.type = type struct.scale = scale return struct end
odoread(scale, **kw, &blk)
click to toggle source
# File lib/rafini/odometers.rb, line 66 def odoread(scale, **kw, &blk) counts = odometer(*scale.values, **kw) ::Hash[scale.keys.zip(counts)].to_struct(&blk) end
scale=(scale)
click to toggle source
# File lib/rafini/odometers.rb, line 119 def scale=(scale) @scale=scale end
sec2time()
click to toggle source
Integer#sec2time Returns a struct with the different time scales for number of seconds.
10_000.sec2time.to_s #=> "2 hours and 46 minutes" 10_000.sec2time.hour #=> 2
# File lib/rafini/odometers.rb, line 75 def sec2time odoread(SEC2TIME, factors:false) do def to_s string = nil SEC2TIME.keys.reverse_each do |key| count=self[key] if string if count > 0 string << " and #{count} #{key}" string << 's' if count > 1 end break end next if count==0 string = "#{count} #{key}" string << 's' if count > 1 end string = "0 #{SEC2TIME.first[0]}s" unless string string end def to_i SEC2TIME.to_a.map{|k,v|v*self[k]}.sum.round end end end
to_i()
click to toggle source
# File lib/rafini/odometers.rb, line 95 def to_i SEC2TIME.to_a.map{|k,v|v*self[k]}.sum.round end
to_s()
click to toggle source
# File lib/rafini/odometers.rb, line 77 def to_s string = nil SEC2TIME.keys.reverse_each do |key| count=self[key] if string if count > 0 string << " and #{count} #{key}" string << 's' if count > 1 end break end next if count==0 string = "#{count} #{key}" string << 's' if count > 1 end string = "0 #{SEC2TIME.first[0]}s" unless string string end
type=(type)
click to toggle source
# File lib/rafini/odometers.rb, line 122 def type=(type) @type=type end