'Return string representation of the number in scientific notation.
Captures all of the information in the underlying representation.'

def __str__(self, eng=False, context=None):

    sign = ['', '-'][self._sign]
    if self._is_special:
        if (self._exp == 'F'):
            return (sign + 'Infinity')
        else:
            if (self._exp == 'n'):
                return ((sign + 'NaN') + self._int)
            return ((sign + 'sNaN') + self._int)
    leftdigits = (self._exp + len(self._int))
    if ((self._exp <= 0) and (leftdigits > (-6))):
        dotplace = leftdigits
    elif (not eng):
        dotplace = 1
    elif (self._int == '0'):
        dotplace = (((leftdigits + 1) % 3) - 1)
    else:
        dotplace = (((leftdigits - 1) % 3) + 1)
    if (dotplace <= 0):
        intpart = '0'
        fracpart = (('.' + ('0' * (- dotplace))) + self._int)
    elif (dotplace >= len(self._int)):
        intpart = (self._int + ('0' * (dotplace - len(self._int))))
        fracpart = ''
    else:
        intpart = self._int[:dotplace]
        fracpart = ('.' + self._int[dotplace:])
    if (leftdigits == dotplace):
        exp = ''
    else:
        if (context is None):
            context = getcontext()
        exp = (['e', 'E'][context.capitals] + ('%+d' % (leftdigits - dotplace)))
    return (((sign + intpart) + fracpart) + exp)
