Kaydet (Commit) 62edb715 authored tarafından Facundo Batista's avatar Facundo Batista

Speedup and cleaning of __str__. Thanks Mark Dickinson.

üst 0f6d4e6c
...@@ -837,81 +837,51 @@ class Decimal(object): ...@@ -837,81 +837,51 @@ class Decimal(object):
Captures all of the information in the underlying representation. Captures all of the information in the underlying representation.
""" """
sign = ['', '-'][self._sign]
if self._is_special: if self._is_special:
if self._isnan(): if self._exp == 'F':
minus = '-'*self._sign return sign + 'Infinity'
if self._int == '0': elif self._exp == 'n':
info = '' return sign + 'NaN' + self._int
else: else: # self._exp == 'N'
info = self._int return sign + 'sNaN' + self._int
if self._isnan() == 2:
return minus + 'sNaN' + info # number of digits of self._int to left of decimal point
return minus + 'NaN' + info leftdigits = self._exp + len(self._int)
if self._isinfinity():
minus = '-'*self._sign # dotplace is number of digits of self._int to the left of the
return minus + 'Infinity' # decimal point in the mantissa of the output string (that is,
# after adjusting the exponent)
if context is None: if self._exp <= 0 and leftdigits > -6:
context = getcontext() # no exponent required
dotplace = leftdigits
tmp = list(self._int) elif not eng:
numdigits = len(self._int) # usual scientific notation: 1 digit on left of the point
leftdigits = self._exp + numdigits
if eng and not self: # self = 0eX wants 0[.0[0]]eY, not [[0]0]0eY
if self._exp < 0 and self._exp >= -6: # short, no need for e/E
s = '-'*self._sign + '0.' + '0'*(abs(self._exp))
return s
# exp is closest mult. of 3 >= self._exp
exp = ((self._exp - 1)// 3 + 1) * 3
if exp != self._exp:
s = '0.'+'0'*(exp - self._exp)
else:
s = '0'
if exp != 0:
if context.capitals:
s += 'E'
else:
s += 'e'
if exp > 0:
s += '+' # 0.0e+3, not 0.0e3
s += str(exp)
s = '-'*self._sign + s
return s
if eng:
dotplace = (leftdigits-1)%3+1
adjexp = leftdigits -1 - (leftdigits-1)%3
else:
adjexp = leftdigits-1
dotplace = 1 dotplace = 1
if self._exp == 0: elif self._int == '0':
pass # engineering notation, zero
elif self._exp < 0 and adjexp >= 0: dotplace = (leftdigits + 1) % 3 - 1
tmp.insert(leftdigits, '.')
elif self._exp < 0 and adjexp >= -6:
tmp[0:0] = ['0'] * int(-leftdigits)
tmp.insert(0, '0.')
else: else:
if numdigits > dotplace: # engineering notation, nonzero
tmp.insert(dotplace, '.') dotplace = (leftdigits - 1) % 3 + 1
elif numdigits < dotplace:
tmp.extend(['0']*(dotplace-numdigits)) if dotplace <= 0:
if adjexp: intpart = '0'
if not context.capitals: fracpart = '.' + '0'*(-dotplace) + self._int
tmp.append('e') elif dotplace >= len(self._int):
else: intpart = self._int+'0'*(dotplace-len(self._int))
tmp.append('E') fracpart = ''
if adjexp > 0: else:
tmp.append('+') intpart = self._int[:dotplace]
tmp.append(str(adjexp)) fracpart = '.' + self._int[dotplace:]
if eng: if leftdigits == dotplace:
while tmp[0:1] == ['0']: exp = ''
tmp[0:1] = [] else:
if len(tmp) == 0 or tmp[0] == '.' or tmp[0].lower() == 'e': if context is None:
tmp[0:0] = ['0'] context = getcontext()
if self._sign: exp = ['e', 'E'][context.capitals] + "%+d" % (leftdigits-dotplace)
tmp.insert(0, '-')
return ''.join(tmp) return sign + intpart + fracpart + exp
def to_eng_string(self, context=None): def to_eng_string(self, context=None):
"""Convert to engineering-type string. """Convert to engineering-type string.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment