On Sep 19, 1:42 pm, Robin Becker <ro...@reportlab.com> wrote: > I'm not really very used to the decimal module so I'm asking here if any one > can > help me with a problem in a well known third party web framework > > The code in question is > > def format_number(value, max_digits, decimal_places): > """ > Formats a number into a string with the requisite number of digits and > decimal places. > """ > if isinstance(value, decimal.Decimal): > context = decimal.getcontext().copy() > context.prec = max_digits > return u'%s' % str( > value.quantize(decimal.Decimal(".1") ** decimal_places, > context=context)) > else: > return u"%.*f" % (decimal_places, value)
What's the meaning of the 'max_digits' argument here? Are you guaranteed that the incoming value is smaller than 10**max_digits in absolute value? If so, then a precision of max_digits + decimal_places + 1 should be enough. The +1 is there to cover the corner case where a value close to 10**max_digits is rounded up to 10**max_digits by the quantize operation. BTW, that's a fairly horrible way of creating the first argument to the quantize method, too. It would be more efficient to do something like: >>> decimal_places = 2 >>> decimal.Decimal('0.{}1'.format('0'*(decimal_places-1))) Decimal('0.01') (perhaps with suitable special-casing for the case where decimal_places <= 0; not sure whether this applies in your context). -- Mark -- http://mail.python.org/mailman/listinfo/python-list