Controlling number of zeros of exponent in scientific notation
Terry Reedy
tjreedy at udel.edu
Wed Mar 6 00:45:10 EST 2013
On 3/5/2013 3:09 PM, faraz at squashclub.org wrote:
> Instead of:
> 1.8e-04
> I need:
> 1.8e-004
>
> So two zeros before the 4, instead of the default 1.
The standard e and g float formats do not give you that kind of control
over the exponent. You have to write code that forms the string you
want. You can put that in a simple function or make a class with a
__format__ method to tie into the new format() and str.format system.
>>> class myfloat(float):
def __format__(self, spec): return '3.14'
>>> x = myfloat(1.4)
>>> x
1.4
>>> format(x, '')
'3.14'
>>> '{}'.format(x)
'3.14'
You could write __format__ to use standard format specs and then adjust:
def __format__(self, spec):
s = float.__format__(self, spec)
<adjust s>
return s
or generate the pieces of the string yourself, possibly using a custom
spec, as opposed to the standard spec. Notice this example from the manual:
'''
Using type-specific formatting:
>>> import datetime
>>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)
>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)
'2010-07-04 12:15:58'
'''
This works because datetime.datetime and a .__format__ that interprets a
highly customized format spec. You could customize myfloat's spec to add
a value for the exponent width. Your example above might be '8.1.3e'
instead of the standard '7.1e'
Standard, real:
>>> format(1.8e-4, '7.1e')
'1.8e-04'
Custom, hypothetical:
>>> format(myfloat(1.8e-4), '8.1.3e')
'1.8e-004'
Dave already suggested how you could write part of .__format__ to make
the latter be real also.
--
Terry Jan Reedy
More information about the Python-list
mailing list