2016-08-27 4 views
2

En Python, la notation scientifique me donne toujours 2 chiffres en exposant:chiffres exposant en notation scientifique en Python

print('%17.8E\n' % 0.0665745511651039) 
6.65745512E-02 

Cependant, je veux mal d'avoir 3 chiffres comme:

6.65745512E-002 

Pouvons-nous faire ceci avec une configuration/fonction intégrée en Python?

Je sais que ma question est fondamentalement la même question que: Python - number of digits in exponent, mais cette question a été posée il y a 4 ans et je ne veux pas appeler une telle fonction des milliers de fois. J'espère qu'il devrait y avoir une meilleure solution maintenant.

+0

double possible de [Python - nombre de chiffres dans exponent] (http://stackoverflow.com/questions/9910972/python-number-of-digits-in-exponent) – vsminkov

Répondre

1

Malheureusement, vous ne pouvez pas modifier ce comportement par défaut puisque vous ne pouvez pas remplacer les méthodes str.

Cependant, vous pouvez envelopper le flotteur, et utiliser la méthode __format__:

class MyNumber: 
    def __init__(self, val): 
     self.val = val 

    def __format__(self,format_spec): 
     ss = ('{0:'+format_spec+'}').format(self.val) 
     if ('E' in ss): 
      mantissa, exp = ss.split('E')    
      return mantissa + 'E'+ exp[0] + '0' + exp[1:] 
     return ss 


    print('{0:17.8E}'.format(MyNumber(0.0665745511651039))) 
+0

Oui, la méthode wrapping-the-float fonctionne parfaitement pour print(). Je vous remercie. Cependant, je voudrais aussi écrire la sortie dans un fichier et cela ne marche qu'à moitié: 'ValueError: littéral invalide pour float(): -4.10522747 + 00' J'ai besoin de votre aide. Laissez-moi éditer ma question originale pour expliquer cette erreur. – IanHacker

+0

Lorsque le nombre est compris entre 1 <= n <10, le format ne fonctionne pas et affiche simplement 2 chiffres. '-6.08474553E-001 -4,10522747 + 00 -4,75716448 + 00 -1.58045329E-002 4,72555542 + 00 ' (Il ne fonctionne pas pour l'impression(), aussi.) Pourriez-vous s'il vous plaît résoudre ce problème? – IanHacker

+0

Mis à jour pour l'exposant positif – napuzba

0

Vous pouvez utiliser votre propre formatter et passer outre format_field:

import string 
class MyFormatter(string.Formatter): 
    def format_field(self, value, format_spec): 
     ss = string.Formatter.format_field(self,value,format_spec) 
     if format_spec.endswith('E'): 
      if ('E' in ss): 
       mantissa, exp = ss.split('E') 
       return mantissa + 'E'+ exp[0] + '0' + exp[1:]     
     return ss 

print(MyFormatter().format('{0:17.8E}',0.00665745511651039))