Numéro d'impression dans l'ingénierie format
Je suis en train d'imprimer un numéro de téléphone dans l'ingénierie format avec python, mais je n'arrive pas à le faire fonctionner. La syntaxe SEMBLE assez simple, mais il ne fonctionne tout simplement pas.
>>> import decimal
>>> x = decimal.Decimal(1000000)
>>> print x
1000000
>>>> print x.to_eng_string()
1000000
Je ne peux pas comprendre pourquoi cela est. Les deux valeurs ne sont pas identiques (l'une est une chaîne, l'autre est un int). Réglage des différents contextes dans decimal
ne semble pas aider non plus. Des indices ou des idées?
J'ai trouvé la solution ici "%.4g" % x
OriginalL'auteur jmurrayufo | 2012-09-07
Vous devez vous connecter pour publier un commentaire.
Pour obtenir que cela fonctionne, vous avez à normaliser la première décimale:
La raison pour cela peut être découvert en fouillant dans le code source.
Si vous examinez
to_eng_string()
dans le Python 2.7.3 de l'arbre source (Lib/decimal.py
du format gzip tar source de balle ici), il appelle simplement__str__
aveceng
définie sur true.Vous pouvez alors voir qu'il décide du nombre de chiffres à la gauche de la décimale d'abord avec:
Le tableau suivant montre que les valeurs de ces deux choses:
Le code qui se poursuit après c'est:
et vous pouvez voir que, sauf s'il est déjà a un exposant dans une certaine plage (
self._exp > 0 or leftdigits <= -6
), aucun ne sera donnée dans la représentation de chaîne.Complément d'enquête indique la raison de ce comportement. En regardant le code lui-même, vous verrez qu'il est basé sur la
Général Arithmétique Décimale Spécification
(PDF ici).Si vous recherchez ce document pour
to-scientific-string
(sur lequelto-engineering-string
est fortement basée), en partie (reformulation, et avec mon bold bits):En d'autres termes, c'est de faire ce qu'il fait parce que c'est ce que la norme indique qu'il n'.
vérifier la mise à jour. Fondamentalement, il le fait parce que c'est ce que la norme dit de faire.
OriginalL'auteur
Je me rends compte que c'est un vieux thread, mais c'est près du sommet d'une recherche de
python engineering notation
.Je suis un ingénieur qui aime le "génie 101" unités d'ingénierie. Je n'ai même pas comme des désignations telles que
0.1uF
, je veux que lire100nF
. J'ai joué avec leDecimal
classe et n'ai pas vraiment aimé son comportement au cours de l'intervalle des valeurs possibles, donc j'ai roulé un paquet appeléengineering_notation
c'est-pip-installable.De l'intérieur Python:
Ce paquet soutient également des comparaisons et d'autres de simples opérations numériques.
https://github.com/slightlynybbled/engineering_notation
OriginalL'auteur
Il me semble que vous allez devoir faire vos propres:
Bien que vous voudrez peut-être prendre un peu plus de soin dans la mise en forme de la
z
partie...pas bien testé. N'hésitez pas à modifier si vous trouvez des bugs
decimal
classe ne fait pas ce qu'il semble qu'il devrait l'être, ou comment je l'utilise malDésolé, je suppose que j'ai mal compris la question :).
OriginalL'auteur
Auparavant, j'ai essayé de répondre, mais a constaté qu'elle est juste encore la notation scientifique.
La notation ingénieur sera pris en charge dans les futures versions de Python spécificateur de format (3.2?), mais pas dans Python 2.7.
Pencher sur cette question http://bugs.python.org/issue8060
paxdiablo interprétation semble erroné, la EFloat mentionné semble être juste une démonstration de classe pour le comportement souhaité. Mais cette question à partir de 2010 a été récemment fermé/rejeté.
OriginalL'auteur