2016-08-27 2 views
2

В Python, научная нотация всегда дает мне 2 цифры в показателе:экспоненты цифры в научной нотации в Python

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

Однако я сильно хочу иметь 3 цифры, как:

6.65745512E-002 

Можем ли мы сделать это со встроенной конфигурацией/функцией в Python?

Я знаю, что мой вопрос в основном такой же вопрос, как: Python - number of digits in exponent, но этот вопрос был задан 4 года назад, и я не хочу называть такую ​​функцию тысячу раз. Надеюсь, теперь должно быть лучшее решение.

+0

Возможный дубликат [Python - количество цифр в экспоненте] (http://stackoverflow.com/questions/9910972/python-number-of-digits-in-exponent) – vsminkov

ответ

1

К сожалению, вы не можете изменить это поведение по-умолчанию, так как вы не можете переопределить методы str.

Однако, вы можете обернуть поплавок и использовать __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

Да, метод wrapping-the-float отлично работает для print(). Спасибо. Тем не менее, я также хотел бы написать вывод в файл, и он работает только наполовину: «ValueError: недействительный литерал для float(): -4.10522747 + 00« Мне нужна ваша помощь. Позвольте мне изменить свой первоначальный вопрос, чтобы объяснить эту ошибку. – IanHacker

+0

Когда число находится между 1 <= n <10, формат не работает и просто показывает 2 цифры. '-6.08474553E-001 -4,10522747 + 00 -4,75716448 + 00 -1.58045329E-002 4,72555542 + 00' (Это не сработало для печати() тоже.) Не могли бы вы это исправить? – IanHacker

+0

Обновлено для положительного экспонента – napuzba

0

Вы можете использовать свой собственный форматера и переопределить 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)) 
Смежные вопросы