class ReeNumber::NumberToHumanSize
def call(number, **opts)
def call(number, **opts) options = DEFAULTS.merge(opts) number = Float(number) if smaller_than_base?(number) number_to_format = number.to_i.to_s else human_size = number / (BASE**exponent(number)) number_to_format = number_to_rounded( human_size, **slice( options, [:precision, :significant, :strip_insignificant_zeros, :round_mode] ) ) end storage_unit_key = storage_unit_key(number) unit = unit(options[:locale], storage_unit_key, number) result_number = options[:format] .gsub("%n", number_to_format) .gsub("%u", unit) number_to_delimited( result_number, **slice(options, [:separator, :delimiter]) ) end
def exponent(number)
def exponent(number) max = STORAGE_UNITS.size - 1 exp = (Math.log(number) / Math.log(BASE)).to_i exp = max if exp > max exp end
def smaller_than_base?(number)
def smaller_than_base?(number) number.to_i < BASE end
def storage_unit_key(number)
def storage_unit_key(number) key_end = smaller_than_base?(number) ? "byte" : STORAGE_UNITS[exponent(number)] "human.sizes.#{key_end}" end
def unit(locale, storage_unit_key, number)
def unit(locale, storage_unit_key, number) t( storage_unit_key, locale: locale, count: number.to_i, raise: true, default_by_locale: :en ) end