Kind of fun exercise (no good for British English).
def units(value, units='bytes'): magnitude = abs(value) if magnitude >= 1000: for prefix in : magnitude /= 1000. if magnitude < 1000.: break elif magnitude < 1: for prefix in : magnitude *= 1000. if magnitude >= 1.0: break if magnitude < .001: return 'zero %s' % units else: prefix = '' if value < 0: return '-%.3f %s%s' % (magnitude, prefix, units) return '%.3f %s%s' % (magnitude, prefix, units)
--Scott David Daniels [EMAIL PROTECTED]
Because I can't resist generalising this. . .
def units(value, units='bytes', base=1000.0,
super_prefixes = ('kilo mega giga tera peta '
'exa zetta yotta').split(), sub_prefixes = ('milli micro nano pico femto ' 'atto zepto yocto').split()): magnitude = abs(value) if magnitude >= base: for prefix in super_prefixes: magnitude /= base if magnitude < base: break elif magnitude < 1.0: for prefix in sub_prefixes: magnitude *= base if magnitude >= 1.0: break if not sub_prefixes or magnitude < .001: return 'zero %s' % units else: prefix = '' if value < 0: return '-%.3f %s%s' % (magnitude, prefix, units) return '%.3f %s%s' % (magnitude, prefix, units)
def bytecount(value): # Should check if these prefixes are right. . . return units(value, 'bytes', 1024.0, 'kibi mebi gibi tebi pebi ebi zebi yobi'.split(), [])
Py> for i in range(1, 28, 3): ... print units(10**i) ... print bytecount(10**i) ... 10.000 bytes 10.000 bytes 10.000 kilobytes 9.766 kibibytes 10.000 megabytes 9.537 mebibytes 10.000 gigabytes 9.313 gibibytes 10.000 terabytes 9.095 tebibytes 10.000 petabytes 8.882 pebibytes 10.000 exabytes 8.674 ebibytes 10.000 zettabytes 8.470 zebibytes 10.000 yottabytes 8.272 yobibytes
Cheers, Nick.
-- Nick Coghlan | [EMAIL PROTECTED] | Brisbane, Australia --------------------------------------------------------------- http://boredomandlaziness.skystorm.net -- http://mail.python.org/mailman/listinfo/python-list