Pregunta

Tengo un programa en Python que lee valores de punto flotante usando la siguiente expresión regular

 (-?\d+\.\d+)

una vez que extraigo el valor usando float (match.group (1)), obtengo el número de punto flotante real. Sin embargo, no puedo distinguir si el número era 1.2345678 o 1.234 o 1.2340000.

El problema al que me enfrento es volver a imprimir el valor de punto flotante, con el mismo formato exacto. Una solución fácil es " dividir y contar " el valor de punto flotante cuando aún es una cadena, p. ej. dividiéndose en el punto decimal, y contando la longitud de la parte entera y la longitud de la parte fraccionaria, luego cree el formateador como

print "%"+str(total_len)+"."+str(fractional_len)+"f" % value

¿pero tal vez conoces una forma estándar de lograr el mismo resultado?

¿Fue útil?

Solución

Tu método es básicamente correcto. El formato de cadena tiene un operador * de uso menos frecuente que puede colocar para los tamaños de formato, aquí hay algunos códigos:

import re

def parse_float(str):
  re_float = re.compile(r'(-?)(\d+)\.(\d+)')
  grps = re_float.search(str)
  sign, decimal, fraction = grps.groups()
  float_val = float('%s%s.%s' % (sign, decimal, fraction))
  total_len = len(grps.group(0))
  print '%*.*f'  % (total_len, len(fraction), float_val)

parse_float('1.2345678')
parse_float('1.234')
parse_float('1.2340000')

y genera

1.2345678
1.234
1.2340000

Otros consejos

Si desea mantener una precisión fija, evite usar float s y use Decimal en su lugar:

>>> from decimal import Decimal
>>> d = Decimal('-1.2345')
>>> str(d)
'-1.2345'
>>> float(d)
-1.2344999999999999
>>> from decimal import Decimal as d
>>> d('1.13200000')
Decimal('1.13200000')
>>> print d('1.13200000')
1.13200000
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top