2010-07-01 13 views
5

C'è una libreria Python che renderebbe i numeri di questo tipo più umano leggibilepitone umano grandi numeri leggibili

$ 187.280.840.422.780

cura: per esempio IW ANT l'uscita di questo per essere 187 Trillion non solo separati da virgola . Quindi voglio uscita sia migliaia di miliardi, milioni, miliardi ecc

+15

Vorrei avere così tanti soldi. –

+1

installa clisp e scrivi: '(formato t" ~ r "(parse-integer (read-line * standard-input *))) quindi usa il sottoprocesso per chiamare' clisp prettynum.cl 187.000.000.000.000' ... Anche se io solo ha chiesto un'alternativa http://stackoverflow.com/questions/3158132/is-there-a-python-version-of-lisps-format-r –

+0

['python-ballpark'] (https://github.com/ debrouwere/python-ballpark) sembra essere progettato esattamente per quello che l'OP chiede. –

risposta

31

A quanto mi risulta, si desidera solo la parte 'più significativa'. Per fare ciò, utilizzare floor(log10(abs(n))) per ottenere il numero di cifre e quindi passare da lì. Qualcosa di simile, forse:

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

Esecuzione della funzione di cui sopra per un po 'di numeri diversi:

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 
+2

Probabilmente dovrei far notare che usando Billion, Trillion non significa lo stesso in Europa continentale come negli Stati Uniti. Anche il Regno Unito non ha adottato la convenzione americana fino a poco tempo fa. Vedi http://en.wikipedia.org/wiki/Long_and_short_scales – Janus

+4

Il risultato dovrebbe essere espresso usando i prefissi delle unità SI, ad es.kilodollars, megadollars, gigadollars ecc :) – tzot

+0

@tzot LOL ma questo è qualcosa a cui potrei abituarmi. –

1

Da here:

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 
1

Questo numero sembra abbastanza leggibile per me. Un numero ostile sarebbe 187289840422780,00. Per aggiungere virgole, è possibile creare la propria funzione o la ricerca di una (ho trovato this):

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 

Se si desidera arrotondare un numero per renderlo più leggibile, v'è una funzione Python per questo: round().

È possibile spostarsi ancora più lontano dai dati effettivi e pronunciare "Un importo molto elevato" o "Oltre 100 trilioni" utilizzando una funzione che restituirebbe un valore diverso in base ai parametri di riferimento programmati.

10

Forse che l'altro giorno con locale:

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

C'è una migliore modo per farlo in 2.7, vedere PEP 378: specificatore di formato per separatore di migliaia per ulteriori informazioni:

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

Edit (2014): In questi giorni ho la seguente funzione di shell invece:

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

Enjoy!