pythonscientific-notationformat-specifiers

Use fixed exponent in scientific notation


Consider the following Python snippet:

for ix in [0.02, 0.2, 2, 20, 200, 2000]:
    iss = str(ix) + "e9"
    isf = float(iss)
    print(iss + "\t=> " + ("%04.03e" % isf) + " (" + str(isf) + ")")

It generates the following output:

0.02e9  => 2.000e+07 (20000000.0)
0.2e9   => 2.000e+08 (200000000.0)
2e9     => 2.000e+09 (2000000000.0)
20e9    => 2.000e+10 (20000000000.0)
200e9   => 2.000e+11 (2e+11)
2000e9  => 2.000e+12 (2e+12)

Is it possible to "go back" somehow? That is:

2.000e+07 => 0.02e9 
2.000e+08 => 0.2e9
2.000e+09 => 2e9    
2.000e+10 => 20e9   
2.000e+11 => 200e9  
2.000e+12 => 2000e9

... I'd specify I want the exponent to be e+09; and then whatever number I throw at this hypothetic function, returns the number value in that exponent? Would it be possible to specify zero padding for both the whole and the decimal part in each case? (i.e. 000.0200e9 and 020.0000e9)?


Solution

  • Format it yourself (see Format Specification Mini-Language):

    for ix in [.02e9, .2e9, 2e9, 20e9, 200e9, 2000e9]:
        print('{:.3e} => {:0=8.3f}e9'.format(ix, ix / 1e9))
    

    Output

    2.000e+07 => 0000.020e9
    2.000e+08 => 0000.200e9
    2.000e+09 => 0002.000e9
    2.000e+10 => 0020.000e9
    2.000e+11 => 0200.000e9
    2.000e+12 => 2000.000e9
    

    Explanation

    {:0=8.3f} means "zero-pad, pad between the sign and the number, total field width 8, 3 places after the decimal, fixed point format".