Michael Hasenstein wrote:
That looks very acceptable to me and a lot of people. Of course, do what
you want, the only reason I post is because when *I* found this thread
looking for such a functionality I copied your code, and only then
realized there's a function already. I respond to let others know right
away who find this through Google.
I think it's excellent that you recorded for the record the simplest
case for others to follow. To be clear, here's the output I want (and
have):
[ 1, 12, 123, 1234, 12345, 123456, 1234567, 12345678, 123456789,
1234567890 ].each{ |bytes|
puts nice_bytes( bytes )
}
#=> 1b
#=> 12b
#=> 123b
#=> 1.21kB
#=> 12.1kB
#=> 121kB
#=> 1.18MB
#=> 11.8MB
#=> 118MB
#=> 1.15GB
With the exception of bytes, I get two decimal places when there are
less than 10 of the amount, one decimal place with less than a hundred,
and no decimal places for hundreds. Windows does this, and I actually
like it. Although unrelated to real significant figures, it's similar:
there are ~always 3 digits displayed. As the number grows in magnitude,
I am less interested in the details of the exact decimals.
When working with a large number of files all in the same rough range,
this lets me automatically visually display them in a way that allows
them to be compared and distinguished, without too much detail.
*shrug*
Not a big deal. As you say, most people will find the rails method suits
their needs.
BTW, here's updated 1.9 compatible code for the function:
K = 2.0**10
M = 2.0**20
G = 2.0**30
T = 2.0**40
def nice_bytes( bytes, max_digits=3 )
value, suffix, precision = case bytes
when 0...K
[ bytes, 'b', 0 ]
else
value, suffix = case bytes
when K...M then [ bytes / K, 'kB' ]
when M...G then [ bytes / M, 'MB' ]
when G...T then [ bytes / G, 'GB' ]
else [ bytes / T, 'TB' ]
end
used_digits = case value
when 0...10 then 1
when 10...100 then 2
when 100...1000 then 3
end
leftover_digits = max_digits - used_digits
[ value, suffix, leftover_digits > 0 ? leftover_digits : 0 ]
end
"%.#{precision}f#{suffix}" % value
end