Как использовать метод format() в python для заполнения чисел после экспоненты E нулями?

Мне удалось почти отформатировать вывод моего числа именно так, как мне нужно, после прочтения некоторой документации по .format и разработки этого кода:

timepoint = 6
strTimepoint = "{:1.7E}".format(timepoint)

при этом печать strTimepoint выдаст это:

# with timepoint = 6
>>6.0000000E+00
# with timepoint = 12
>>1.2000000E+01

и так далее.

Единственное, что мне нужно сделать, чтобы сделать эту строку нужной мне, это чтобы цифры экспоненты были дополнены нулями, чтобы они были тремя цифрами, следовательно:

# timepoint = 6
>>6.0000000E+000
# timepoint = 12 
>>1.2000000E+001

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


person gt_yei    schedule 03.04.2015    source источник


Ответы (2)


Похоже, что это просто невозможно с одним вызовом str.format.

Это будет не так красиво, но вы можете просто добавить еще один:

# Regular Python's scientific notation, split up to coefficient and exponent.
x, e = "{:1.7E}".format(timepoint).split("E")

# Format again: coefficient first, then sign, then padded "sign-less" exponent.
strTimepoint = "{}E{}{:0>3}".format(x, e[0], e[1:])

Оборачивать все это в функцию, конечно, настоятельно рекомендуется (настройте имя в соответствии с вашими потребностями):

def foo(timepoint):
    # Regular Python's scientific notation, split up to coefficient and
    # exponent.
    x, e = "{:1.7E}".format(timepoint).split("E")

    # Format again: coefficient first, then sign, then padded "sign-less"
    # exponent.
    return "{}E{}{:0>3}".format(x, e[0], e[1:])


foo(6)  # '6.0000000E+000'
foo(12)  # '1.2000000E+001'
foo(1e123)  # '1.0000000E+123'
person Unit03    schedule 03.04.2015

Вы можете вставить 0 после факта с помощью re.sub, но это приведет к удлинению строки на один символ в случае, если произойдет замена:

>>> re.compile("(E[-+])(\d\d)$").sub(r'\g<1>0\2',"{:7.1E}".format(6E19))
'6.0E+019'

В формате 7.1 это не проблема, потому что если бы показатель степени состоял из трех цифр, минимальная длина поля была бы 8:

>>> re.compile("(E[-+])(\d\d)$").sub(r'\g<1>0\2',"{:7.1E}".format(6E190))
'6.0E+190'

Но в целом это может привести к перекосам.

(Конечно, в реальном коде вы бы скомпилировали это регулярное выражение только один раз, а не каждый раз, когда выполняете преобразование.)

person rici    schedule 03.04.2015