8
votes

Formater verbalement un numéro en python

Comment Pythonistas imprimer un nombre en tant que mots, comme l'équivalent du code LISP commun:

[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


0 commentaires

3 Réponses :


8
votes

Non dans le noyau Python, mais il y a une bibliothèque 3ème partie 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'


4 commentaires

Excellent - j'ai remarqué que, mais c'est une erreur dans la façon dont Python (C?) Gère l'expression exponentielle: int (1e25) produit 10000000000000000905969664L et 1 * 10 ** 25 produit 1000000000000000000000000000L . Étrange?


Pas étrange du tout. 1e25 est "Rendre la valeur du point flottant le plus proche de 10 ^ 25", et 1 * 10 ** 25 dit "Multipliez 1 par le résultat de la multiplication de 10 par lui-même 25 fois". L'arithmétique à virgule flottante fixe (sur un ordinateur) n'est pas mathématiquement précise, tandis que les entiers des versions récentes de Python sont une précision arbitraire.


1E25 n'est pas une "expression exponentielle", c'est un littéral à virgule flottante. Et un numéro de point flottant dans Python ne peut pas représenter exactement 10 25 (et cela ne devrait pas être une grande surprise étant donné que 2 84> 10 25> 2 83).


Intéressant et informatif! Sur la base de cette information, j'étais curieux et joué un peu, et si vous voulez une précision, vous pouvez Import Décimal; d = décimal.decimal ('1e25') et vous n'obtiendrez pas l'erreur de point flottante.



1
votes

Je viens de commencer un travail en turc, il peut être utile.

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

Il renvoie une liste de chaînes et est livré avec des fonctions de test faciles randomizer () prettizer () et la fonction principale humaniseur ()

Il peut gérer de très grands nombres car il n'a pas utilisé l'approche de division, mais utilise la segmentation de chaîne et la manipulation.

Vous pouvez entrer un nombre pair ou une chaîne.

puisque je n'ai pas écrit de vérification de numéro, il peut même gérer un texte non numérique. :) xxx


0 commentaires

0
votes

ici comme un moyen de le faire:

>>> abbreviate(11423)
11.43 K


1 commentaires

Cela ne répond pas à la question et la question est de près de neuf ans!