pythonformatnotationexponential

Scientific Notation precision normalizing


My goal is simply to convert a string such as "1.2" to scientific notation without adding additional precision. The problem is that I always end up with superfluous 0s at the end of my output.

>>> input = "1.2"
>>> print '{:e}'.format(float(input))
1.200000e+00

I'm trying to figure out how to get just 1.2e+00. I realize I can specify precision in my format statement, but I don't want to truncate longer strings unnecessarily. I just want to suppress the training 0s.

I've tried using Decimal.normalize(), which works in all cases, except where e < 2.

>>> print Decimal("1.2000e+4").normalize()
1.2E+4
>>> print Decimal("1.2000e+1").normalize()
12

So that's better, except I don't want 12, I want 1.2e+1. :P

Any suggestions would be greatly appreciated!

Edit: To clarify, the input value has already been rounded appropriately to a predetermined length that is now unknown. I'm trying to avoid recalculating the appropriate formatting precision.

Basically, I could have input values of "1.23" and "1234.56", which should come out as "1.23e+0" and "1.23456e+3".

I may have to just check how long the input string is and use that to specify a precision manually, but I wanted to check and make sure I just wasn't missing something that could just prevent the exponential format from arbitrarily adding 0s.


Solution

  • Just going back through and cleaning up old questions. I ended up solving this by writing a little function to intuit the initial precision of a number and then using it to format the output result.

    #used to determine number of precise digits in a string
    def get_precision(str_value):
        vals =  str_value.split('.')
        if (vals[0] == '0'):
            return len(vals[1])
        else:
            return len(str_value) -1
    
    # maintain same precision of incoming string on output text
    class ExpDecorator(CurrencyDecorator):
        def get_text(self):
            text = self.decoratedCurrency.get_text()
            return ('{:.' + str(get_precision(text)-1) + 'e}').format(float(text))
    

    Not really the most elegant solution, but the task was kind of obnoxious to begin with and it got the job done.