3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
# File 'lib/si/module.rb', line 3
def convert num, options = {}
options = { :length => options } if options.is_a?(Fixnum)
options = DEFAULT.merge(options)
length,
min_exp,
max_exp = options.values_at(:length, :min_exp, :max_exp)
raise ArgumentError.new("Invalid length") if length < 2
return num.is_a?(Fixnum) ? '0' : "0.#{'0' * (length - 1)}" if num == 0
base = options[:base].to_f
minus = num < 0 ? '-' : ''
nump = num.abs
PREFIXES.keys.sort.reverse.select { |exp| (min_exp..max_exp).include? exp }.each do |exp|
denom = base ** exp
if nump >= denom || exp == min_exp
val = nump / denom
val = SI.round val, [length - val.to_i.to_s.length, 0].max
val = val.to_i if exp == 0 && num.is_a?(Fixnum)
val = val.to_s.ljust(length + 1, '0') if val.is_a?(Float)
return "#{minus}#{val}#{PREFIXES[exp]}"
end
end
nil
end
|