2009-02-23 10 views
17

Was ist ein einfacher Weg in Python, ganze Zahlen in Zeichenketten zu formatieren, die Tausende mit K und Millionen mit M darstellen, und nur ein paar Stellen hinter Komma lassen?Formatieren von langen Zahlen als Strings in Python

Ich würde 7436313 als 7,44 M und 2345 als 2,34 K zeigen.

Gibt es dafür einen Operator% String Formatierung? Oder könnte das nur getan werden, indem man in einer Schleife tatsächlich durch 1000 teilt und die Ergebniskette Schritt für Schritt konstruiert?

Antwort

34

Ich glaube nicht, es gibt einen eingebauten in Funktion, die das tut. Sie werden rollen, um Ihre eigene, zB:

def human_format(num): 
    magnitude = 0 
    while abs(num) >= 1000: 
     magnitude += 1 
     num /= 1000.0 
    # add more suffixes if you need them 
    return '%.2f%s' % (num, ['', 'K', 'M', 'G', 'T', 'P'][magnitude]) 

print('the answer is %s' % human_format(7436313)) # prints 'the answer is 7.44M' 
+0

999999 Displays 1000.00K wenn es 1M sagen sollte. – rtaft

0

Kein String Formatierungsoperator, according to the docs. Ich habe noch nie von so etwas gehört, also müssen Sie vielleicht selbst rollen, wie Sie vorschlagen.

0

Ich glaube nicht, dass es Formatoperatoren dafür gibt, aber Sie können einfach durch 1000 dividieren, bis das Ergebnis zwischen 1 und 999 ist, und dann eine Formatzeichenfolge für 2 Ziffern nach dem Komma verwenden. Unit ist in den meisten Fällen ein einzelnes Zeichen (oder eine kleine Zeichenfolge), die Sie in einer Zeichenfolge oder einem Array speichern und nach jeder Teilung durchlaufen können.

0

ich diese Funktion heute benötigt wird, aktualisiert die akzeptierte Antwort ein wenig für Menschen mit 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: angesichts der Kommentare Sie könnten zu round(num/1000.0)

+0

999999 zeigt 1000,00K an, wenn es 1M ist. – rtaft

1

Ein mehr "Mathe-y" Lösung ändern möchten ist math.log zu verwenden:

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

999999 zeigt 1000.00K wenn es 1M sagen soll. – rtaft

5

Diese Version vom Bug nicht in den vorangegangenen Antworten leiden, wo 999.999 Sie 1000.0K gibt. Es erlaubt auch nur 3 signifikante Zahlen und eliminiert nachfolgende Nullen.

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]) 

Die Ausgabe sieht so aus:

>>> human_format(999999) 
'1M' 
>>> human_format(999499) 
'999K' 
>>> human_format(9994) 
'9.99K' 
>>> human_format(9900) 
'9.9K' 
>>> human_format(6543165413) 
'6.54B' 
+0

dies ist die einzige Version, die perfekt für mich funktioniert (keine lästigen schleppenden 0s) –