Есть ли строковый формат для чисел с плавающей точкой, который всегда начинается с 0.x? - PullRequest
0 голосов
/ 19 сентября 2018

Мне нужен очень специфический формат строки для чисел с плавающей запятой в Python.

Мне нужно, чтобы все числа выглядели так:

0.313575791515242E+005
0.957214231058814E+000
0.102484469467859E+002
0.251532655168561E-001
0.126906478919395E-002
-0.469847611408333E-003

Они всегда начинаются с 0.x с 15 цифрамипосле десятичной точки и заканчиваются 3-мя цифрами в экспоненте.

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

Я попробовал с этим:

>>> number = 9.622
>>> print(f'{number:.15E}')
9.622000000000000E+00

Что довольно близко, но мне все еще нужен ведущий 0и 3 цифры в показателе степени.Это должно быть так:

0.962200000000000E+001

Любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Какой-то славный хакер.Использует обычное форматирование строки научной нотации Python, затем изменяет результат, сдвигая все цифры на 1 и увеличивая показатель степени на 1.

import re

def sci_after_point(number, significant_digits=15, exponent_digits=3):
    '''Returns the number in scientific notation
    with the significant digits starting immediately after the decimal point.'''

    number_sci = f'{number:.{significant_digits-1}E}'

    sign, lead, point, decimals, E, exponent =\
    re.match(r'([-+]?)(\d)(\.)(\d+)(E)(.*)', number_sci).groups()

    incremented_exponent = int(exponent) + 1
    incremented_exponent = f"{incremented_exponent:+0{exponent_digits + 1}}"

    return sign + '0' + point + lead + decimals + E + incremented_exponent

sci_after_point(-0.313575791515242E005)
Out: '-0.313575791515242E+005'
0 голосов
/ 19 сентября 2018

Не уверен, какова логика для -/+ до показателя степени, но это должно дать вам хорошее начало, я надеюсь:

def format(n):
    p = 0
    while n <= -1 or n >= 1:
        n = n / 10.0
        p += 1
    # p could be >= 100 at this point, but we can't do anything
    return "{:.15f}E{:+04d}".format(n, p)
...