цифры экспоненты в научном представлении в Python

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

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

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

6.65745512E-002

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

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


person IanHacker    schedule 27.08.2016    source источник
comment
Возможный дубликат Python - количество цифр в экспоненте   -  person vsminkov    schedule 27.08.2016


Ответы (2)


К сожалению, вы не можете изменить это поведение по умолчанию, так как вы не можете переопределить 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)))
person napuzba    schedule 27.08.2016
comment
Да, метод wrapping-the-float отлично работает для print (). Спасибо. Однако я также хотел бы записать вывод в файл, и он работает только наполовину: «ValueError: недопустимый литерал для float (): -4.10522747 + 00» Мне нужна ваша помощь. Позвольте мне отредактировать свой исходный вопрос, чтобы объяснить эту ошибку. - person IanHacker; 28.08.2016
comment
Когда число находится между 1 ‹= n‹ 10, формат не работает и просто показывает 2 цифры. `-6.08474553E-001 -4.10522747 + 00 -4.75716448 + 00 -1.58045329E-002 4.72555542 + 00` (Это не сработало и для print ().) Не могли бы вы это исправить? - person IanHacker; 28.08.2016
comment
Обновлено для положительной экспоненты - person napuzba; 28.08.2016
comment
Работает как часы. Теперь он показывает все в 3-х цифрах. `-6.08474553E-001 -4.10522747E + 000 -4.75716448E + 000 -1.58045329E-002 4.72555542E + 000` Большое вам спасибо! - person IanHacker; 28.08.2016

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