2010-07-01 3 views
5

est-il une bibliothèque python qui ferait des nombres tels que cette plus lisible humainepython NOMBREUX lisibles par l'homme

$ 187.280.840.422.780

modifié: par exemple iw ant la sortie de ce pour être 187 billions non seulement séparés par des virgules . Je veux donc être sortie des billions de millions, des milliards etc

+15

J'aimerais avoir autant d'argent. –

+1

installez clisp et écrivez ceci: '(format t" ~ r "(parse-entier (read-line * standard-input *)))' puis utilisez subprocess pour appeler 'clisp prettynum.cl 187,000,000,000,000' ... Bien que je viens interrogé sur une alternative http://stackoverflow.com/questions/3158132/is-there-a-python-version-of-lisps-format-r –

+0

['python-ballpark'] (https://github.com/ debrouwere/python-ballpark) semble être conçu exactement pour ce que le PO demande. –

Répondre

31

Si je comprends bien, vous voulez que la partie « la plus importante ». Pour ce faire, utilisez floor(log10(abs(n))) pour obtenir le nombre de chiffres, puis continuez à partir de là. Quelque chose comme ça, peut-être:

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

L'exécution de la fonction ci-dessus pour un tas de numéros différents:

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

Je devrais probablement souligner qu'en utilisant Billion, Trillion ne signifie pas la même chose en Europe continentale qu'aux États-Unis. Même le Royaume-Uni n'a pas adopté la convention américaine jusqu'à récemment. Voir http://en.wikipedia.org/wiki/Long_and_short_scales – Janus

+4

Le résultat doit être exprimé en utilisant les préfixes d'unités SI, c.-à-d.kilodollars, mégadollars, gigadollars etc :) – tzot

+0

@tzot LOL mais c'est quelque chose que je pourrais m'y habituer. –

1

De 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

Ce numéro me semble assez lisible par l'homme à. Un nombre hostile serait 187289840422780.00. Pour ajouter des virgules, vous pouvez créer votre propre fonction ou la recherche d'un (j'ai trouvé 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 

Si vous souhaitez arrondir un nombre pour le rendre plus lisible, il y a une fonction python pour que: round(). Vous pouvez vous éloigner encore plus des données réelles et dire «Un montant très élevé» ou «Au-delà de 100 trillions» en utilisant une fonction qui retournerait une valeur différente en fonction de vos repères programmés.

10

Est-ce que l'autre jour avec locale:

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

Il y a une meilleure façon de le faire en 2.7, voir PEP 378: Spécificateur de format pour séparateur de milliers pour plus d'informations:

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

Edit (2014): Ces jours, j'ai la fonction shell suivante à la place:

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

Enjoy!

Questions connexes