Todo el mundo lo que sugiere el uso del código de formato f
cadena está suponiendo implícitamente que está bien para fijar el número de dígitos después del punto decimal. Eso me parece una suposición muy débil. Sin embargo, si no hace esa suposición, no hay un mecanismo incorporado para hacer lo que quiera. Este es el mejor truco que surgió cuando me enfrenté a un problema similar (en un generador de PDF: los números en PDF no pueden usar la notación exponencial). Probablemente desee quitar todos los b
de las cuerdas, y puede haber otros Python3-isms aquí.
_ftod_r = re.compile(
br'^(-?)([0-9]*)(?:\.([0-9]*))?(?:[eE]([+-][0-9]+))?$')
def ftod(f):
"""Print a floating-point number in the format expected by PDF:
as short as possible, no exponential notation."""
s = bytes(str(f), 'ascii')
m = _ftod_r.match(s)
if not m:
raise RuntimeError("unexpected floating point number format: {!a}"
.format(s))
sign = m.group(1)
intpart = m.group(2)
fractpart = m.group(3)
exponent = m.group(4)
if ((intpart is None or intpart == b'') and
(fractpart is None or fractpart == b'')):
raise RuntimeError("unexpected floating point number format: {!a}"
.format(s))
# strip leading and trailing zeros
if intpart is None: intpart = b''
else: intpart = intpart.lstrip(b'0')
if fractpart is None: fractpart = b''
else: fractpart = fractpart.rstrip(b'0')
if intpart == b'' and fractpart == b'':
# zero or negative zero; negative zero is not useful in PDF
# we can ignore the exponent in this case
return b'0'
# convert exponent to a decimal point shift
elif exponent is not None:
exponent = int(exponent)
exponent += len(intpart)
digits = intpart + fractpart
if exponent <= 0:
return sign + b'.' + b'0'*(-exponent) + digits
elif exponent >= len(digits):
return sign + digits + b'0'*(exponent - len(digits))
else:
return sign + digits[:exponent] + b'.' + digits[exponent:]
# no exponent, just reassemble the number
elif fractpart == b'':
return sign + intpart # no need for trailing dot
else:
return sign + intpart + b'.' + fractpart
posible duplicado de [Imprimir un número flotante en forma normal, no exponencial] (http://stackoverflow.com/questions/7801586/print-a-float-number-in-normal-form-not-exponential) –