formatting long numbers as strings in python

后端 未结 9 2433
轻奢々
轻奢々 2020-11-28 07:00

What is an easy way in Python to format integers into strings representing thousands with K, and millions with M, and leaving just couple digits after comma?

I\'d li

相关标签:
9条回答
  • 2020-11-28 07:25

    I needed this function today, refreshed the accepted answer a bit for people with Python >= 3.6:

    def human_format(num, precision=2, suffixes=['', 'K', 'M', 'G', 'T', 'P']):
        m = sum([abs(num/1000.0**x) >= 1 for x in range(1, len(suffixes))])
        return f'{num/1000.0**m:.{precision}f}{suffixes[m]}'
    
    print('the answer is %s' % human_format(7454538))  # prints 'the answer is 7.45M'
    

    Edit: given the comments, you might want to change to round(num/1000.0)

    0 讨论(0)
  • 2020-11-28 07:27

    This version does not suffer from the bug in the previous answers where 999,999 gives you 1000.0K. It also only allows 3 significant figures and eliminates trailing 0's.

    def human_format(num):
        num = float('{:.3g}'.format(num))
        magnitude = 0
        while abs(num) >= 1000:
            magnitude += 1
            num /= 1000.0
        return '{}{}'.format('{:f}'.format(num).rstrip('0').rstrip('.'), ['', 'K', 'M', 'B', 'T'][magnitude])
    

    The output looks like:

    >>> human_format(999999)
    '1M'
    >>> human_format(999499)
    '999K'
    >>> human_format(9994)
    '9.99K'
    >>> human_format(9900)
    '9.9K'
    >>> human_format(6543165413)
    '6.54B'
    
    0 讨论(0)
  • 2020-11-28 07:28

    I had the same need. And if anyone comes on this topic, I found a lib to do so: https://github.com/azaitsev/millify

    Hope it helps :)

    0 讨论(0)
  • 2020-11-28 07:36

    Variable precision and no 999999 bug:

    def human_format(num, round_to=2):
        magnitude = 0
        while abs(num) >= 1000:
            magnitude += 1
            num = round(num / 1000.0, round_to)
        return '{:.{}f}{}'.format(round(num, round_to), round_to, ['', 'K', 'M', 'G', 'T', 'P'][magnitude])
    
    0 讨论(0)
  • 2020-11-28 07:38

    A more "math-y" solution is to use math.log:

    from math import log, floor
    
    
    def human_format(number):
        units = ['', 'K', 'M', 'G', 'T', 'P']
        k = 1000.0
        magnitude = int(floor(log(number, k)))
        return '%.2f%s' % (number / k**magnitude, units[magnitude])
    

    Tests:

    >>> human_format(123456)
    '123.46K'
    >>> human_format(123456789)
    '123.46M'
    >>> human_format(1234567890)
    '1.23G'
    
    0 讨论(0)
  • 2020-11-28 07:38

    I don't know of any built-in capability like this, but here are a couple of list threads that may help:

    http://coding.derkeiler.com/Archive/Python/comp.lang.python/2005-09/msg03327.html http://mail.python.org/pipermail/python-list/2008-August/503417.html

    0 讨论(0)
提交回复
热议问题