Python humanos legibles grandes números

¿Existe una biblioteca de Python que haría que números como este sean más legibles para los humanos?

$ 187,280,840,422,780

editado: por ejemplo, si la salida de esto es de 187 trillones, no solo separados por comas. Así que quiero que la producción sea de billones, millones, billones, etc.

Como lo entiendo, solo quieres la parte ‘más significativa’. Para hacerlo, use floor(log10(abs(n))) para obtener el número de dígitos y luego vaya desde allí. Algo como esto, tal vez:

 import math millnames = ['',' Thousand',' Million',' Billion',' Trillion'] def millify(n): n = float(n) millidx = max(0,min(len(millnames)-1, int(math.floor(0 if n == 0 else math.log10(abs(n))/3)))) return '{:.0f}{}'.format(n / 10**(3 * millidx), millnames[millidx]) 

Ejecutando la función anterior para un montón de números diferentes:

 for n in (1.23456789 * 10**r for r in range(-2, 19, 1)): print('%20.1f: %20s' % (n,millify(n))) 0.0: 0 0.1: 0 1.2: 1 12.3: 12 123.5: 123 1234.6: 1 Thousand 12345.7: 12 Thousand 123456.8: 123 Thousand 1234567.9: 1 Million 12345678.9: 12 Million 123456789.0: 123 Million 1234567890.0: 1 Billion 12345678900.0: 12 Billion 123456789000.0: 123 Billion 1234567890000.0: 1 Trillion 12345678900000.0: 12 Trillion 123456789000000.0: 123 Trillion 1234567890000000.0: 1235 Trillion 12345678899999998.0: 12346 Trillion 123456788999999984.0: 123457 Trillion 1234567890000000000.0: 1234568 Trillion 

Hizo que el otro día con locale:

 import locale locale.setlocale(locale.LC_ALL, 'en_US') locale.format('%d', 2**32, grouping=True) # returns '4,294,967,296' 

Hay una mejor manera de hacerlo en 2.7, vea PEP 378: Especificador de formato para miles de separadores para más información:

http://www.python.org/dev/peps/pep-0378/

Editar (2014): estos días tengo la siguiente función de shell en su lugar:

 human_readable_numbers () { python2.7 -c "print('{:,}').format($1)" } 

¡Disfrutar!

Ese número me parece bastante humano. Un número hostil sería 187289840422780.00. Para agregar comas, puede crear su propia función o buscar una (encontré esto ):

 import re def comma_me(amount): orig = amount new = re.sub("^(-?\d+)(\d{3})", '\g<1>,\g<2>', amount) if orig == new: return new else: return comma_me(new) f = 12345678 print comma_me(`f`) Output: 12,345,678 

Si desea redondear un número para hacerlo más legible, hay una función de python para eso: round() .

Podría alejarse aún más de los datos reales y decir “Una cantidad muy alta” o “Por encima de 100 trillones” utilizando una función que devolvería un valor diferente en función de sus puntos de referencia progtwigdos.

Desde aqui

 def commify(n): if n is None: return None if type(n) is StringType: sepdec = localenv['mon_decimal_point'] else: #if n is python float number we use everytime the dot sepdec = '.' n = str(n) if sepdec in n: dollars, cents = n.split(sepdec) else: dollars, cents = n, None r = [] for i, c in enumerate(reversed(str(dollars))): if i and (not (i % 3)): r.insert(0, localenv['mon_thousands_sep']) r.insert(0, c) out = ''.join(r) if cents: out += localenv['mon_decimal_point'] + cents return out 

Si por “legible” quiere decir “palabras”; Aquí hay una buena solución que puedes adaptar.

http://www.andrew-hoyer.com/experiments/numbers