2009-02-23 26 views
17

¿Cuál es una manera fácil en Python para formatear enteros en cadenas que representan miles con K y millones con M, y dejando sólo dos dígitos después de la coma?formateando números largos como cadenas en python

Me gustaría mostrar 7436313 como 7.44M y 2345 como 2,34K.

¿Hay algún operador de formato% string disponible para eso? ¿O eso solo se podría hacer dividiendo en realidad por 1000 en un bucle y construyendo la cadena de resultados paso a paso?

Respuesta

34

No creo que hay una incorporado en la función que hace eso. Vas a tener que rodar su propia cuenta, por ejemplo:

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 pantallas 1000.00K cuando debería decir 1M. – rtaft

0

Sin operador de formato de cadenas, according to the docs. Nunca había oído hablar de tal cosa, por lo que es posible que tenga que rodar el suyo, como sugiere.

0

No creo que haya operadores de formato para eso, pero puedes simplemente dividir por 1000 hasta que el resultado esté entre 1 y 999 y luego usar una cadena de formato para 2 dígitos después de la coma. La unidad es un solo carácter (o tal vez una pequeña cadena) en la mayoría de los casos, que puede almacenar en una cadena o matriz e iterar a través de ella después de cada división.

0

que necesitaba esta función hoy, refrescado la respuesta aceptada un poco para las personas con 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' 

Editar: teniendo en cuenta los comentarios , es posible que desee cambiar a round(num/1000.0)

+0

999999 muestra 1000.00K cuando debería decir 1M. – rtaft

1

Una solución más "matemáticas-y" es utilizar 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]) 

Pruebas:

>>> human_format(123456) 
'123.46K' 
>>> human_format(123456789) 
'123.46M' 
>>> human_format(1234567890) 
'1.23G' 
+0

999999 muestra 1000.00K cuando debería decir 1M. – rtaft

5

Esta versión no sufre el fallo en las respuestas anteriores, donde le da 999.999 1000.0K. También solo permite 3 cifras significativas y elimina los 0 finales.

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

La salida será similar a:

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

esta es la única versión que funciona perfectamente para mí (sin molestos 0 finales) –