Reputation: 581
In Python, scientific notation always gives me 2 digits in exponent:
print('%17.8E\n' % 0.0665745511651039)
6.65745512E-02
However, I badly want to have 3 digits like:
6.65745512E-002
Can we do this with a built-in configuration/function in Python?
I know my question is basically the same question as: Python - number of digits in exponent, but this question was asked 4 years ago and I don't want to call such a function thousand times. I hope there should be a better solution now.
Upvotes: 8
Views: 9361
Reputation: 1791
You can use the numpy.format_float_scientific()
to do this:
import numpy as np
foo = -0.000123
foo_str = np.format_float_scientific(foo, precision=2, exp_digits=1)
print(foo_str)
will give:
-1.23e-4
Or with 3 exponent positions like the OP was seeking (exp_digits=3
):
-1.23e-004
Upvotes: 0
Reputation: 6288
You can use your own formatter and override 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) )
Upvotes: 0
Reputation: 6288
Unfortunately, you can not change this default behavior since you can not override the str
methods.
However, you can wrap the float, and use the __format__
method:
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)))
Upvotes: 4