Scott David Daniels wrote:
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
  • Re... Nick Coghlan
    • ... Nick Coghlan
    • ... Roel Schroeven
      • ... Peter Hansen
    • ... Pierre Hanser
      • ... Peter Hansen
    • ... Nick Craig-Wood
      • ... Dan Bishop
        • ... Jong <ruud<dot>de<dot>jong<at>consunet <dot>

Reply via email to