Human readable number formatting

J Correia correia_jREMOVECAPS at hotmail.com
Tue Sep 27 21:01:25 EDT 2005


"Alex Willmer" <alex at moreati.org.uk> wrote in message
news:1127862406.11827.2.camel at localhost.localdomain...
> When reporting file sizes to the user, it's nice to print '16.1 MB',
> rather than '16123270 B'. This is the behaviour the command 'df -h'
> implements. There's no python function that I could find to perform this
> formatting , so I've taken a stab at it:
>
> import math
> def human_readable(n, suffix='B', places=2):
>     '''Return a human friendly approximation of n, using SI prefixes'''
>     prefixes = ['','k','M','G','T']
>     base, step, limit = 10, 3, 100
>
>     if n == 0:
>         magnitude = 0 #cannot take log(0)
>     else:
>         magnitude = math.log(n, base)
>
>     order = int(round(magnitude)) // step
>     return '%.1f %s%s' % (float(n)/base**(order*step), \
>                           prefixes[order], suffix)
>
> Example usage
> >>> print [human_readable(x) for x in [0, 1, 23.5, 100, 1000/3, 500,
> 1000000, 12.345e9]]
> ['0.0 B', '1.0 B', '23.5 B', '100.0 B', '0.3 kB', '0.5 kB', '1.0 MB',
> '12.3 GB']
>
> I'd hoped to generalise this to base 2 (eg human_readable(1024, base=2)
> == '1 KiB' and enforcing of 3 digits at most (ie human_readable(100) ==
> '0.1 KB' instead of '100 B). However I can't get the right results
> adapting the above code.
>
> Here's where I'd like to ask for your help.
> Am I chasing the right target, in basing my function on log()?
> Does this function already exist in some python module?
> Any hints, or would anyone care to finish it off/enhance it?
>
> With thanks
>
> Alex
>
>

This'll probably do what you want with some minor modifications.

def fmt3(num):
    for x in ['','Kb','Mb','Gb','Tb']:
        if num<1024:
            return "%3.1f%s" % (num, x)
        num /=1024

>>> print [fmt3(x) for x in [0, 1, 23.5, 100, 1000/3, 500, 1000000, 12.345e9]]
['0.0', '1.0', '23.5', '100.0', '333.0', '500.0', '976.6Kb', '11.5Gb']

HTH.







More information about the Python-list mailing list