2010-07-01 5 views
7

Wie Pythonistas eine Zahl als Worte drucken zu tun, wie das Äquivalent des Common Lisp-Code:forma Verbal eine Zahl in Python

[3]> (format t "~r" 1e25) 
nine septillion, nine hundred and ninety-nine sextillion, nine hundred and ninety-nine quintillion, seven hundred and seventy-eight quadrillion, one hundred and ninety-six trillion, three hundred and eight billion, three hundred and sixty-one million, two hundred and sixteen thousand 

Antwort

7

nicht in Python Kern, aber es gibt 3rd-Party-Bibliothek num2words

>>> from num2words import num2words 
>>> num2words(1e25) 
'ten septillion, one billion, seventy-three million, seven hundred and forty-one thousand, eight hundred and twenty-four' 

>>> num2words(10000000000000000000000000) 
'ten septillion' 

(beachten Sie, dass 1e25 wird nicht genau in Ganzzahl konvertiert, weder in Ihrem Beispiel)

+0

Excellent handhaben kann - (? C) Ich habe bemerkt, tatsächlich das, aber es ist ein Fehler, wie Python behandelt die exponentiellen ausdruck: 'int (1e25)' erzeugt '1000000000000000000905969664L' und' 1 * 10 ** 25' erzeugt '1000000000000000000000000000L'. Seltsam? –

+2

Nicht sonderlich seltsam. '1e25' ist" mache den Gleitkommawert am nächsten zu 10^25 ", und' 1 * 10 ** 25' sagt "multipliziere 1 mit dem Ergebnis, dass 10 selbst 25 Mal multipliziert wird". Gleitkommaarithmetik mit fester Breite (auf einem Computer) ist mathematisch nicht präzise, ​​während Integer in neueren Versionen von Python willkürlich sind. – Ken

+2

1e25 ist kein "exponentieller Ausdruck", sondern ein Fließkomma-Literal. Und eine Fließkommazahl in Python kann nicht genau 10 ** 25 darstellen (und das sollte keine große Überraschung sein, da 2 ** 84> 10 ** 25> 2 ** 83). – 6502

1

Ich habe gerade eine Arbeit in Türkisch gestartet, kann es hilfreich sein.

https://github.com/guneysus/humanizer-tr

Es hat eine Liste von Strings zurück und kommt mit einfachen Testfunktionen randomizer()prettizer() und die Kernfunktion humanizer()

Es sehr großen Zahlen umgehen kann, weil es nicht Ansatz verwendet haben Dividieren, verwendet aber Zeichenfolge Segmentierung und Manipulation.

Sie können eine gerade Zahl oder eine Zeichenfolge eingeben.

Da ich keine Nummernüberprüfung schreiben habe es auch einen nicht-Nummer Text :)

>>> humanizer('STACK OVER FLOW') 
['STA Trilyon', 'CK Milyar', 'OVE Milyon', 'R F Bin', 'LOW']