Question

J'ai un programme python qui lit les valeurs en virgule flottante à l'aide de l'expression régulière suivante

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

une fois que j'extrais la valeur en utilisant float (match.group (1)), je récupère le nombre à virgule flottante. Cependant, je ne suis pas en mesure de distinguer si le nombre était 1.2345678 ou 1.234 ou 1.2340000.

Le problème auquel je suis confronté est de réimprimer la valeur en virgule flottante, avec exactement le même formatage. Une solution simple consiste à "scinder et compter". la valeur en virgule flottante quand il s'agit d'une chaîne, par exemple se séparant au point décimal, en comptant la longueur de la partie entière et la longueur de la partie décimale, puis créez le formateur de la manière

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

mais peut-être connaissez-vous un moyen standard d’atteindre le même résultat?

Était-ce utile?

La solution

Votre méthode est fondamentalement correcte. Le formatage de chaîne a un opérateur * moins souvent utilisé que vous pouvez utiliser pour les tailles de formatage, voici du code:

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')

et il génère

1.2345678
1.234
1.2340000

Autres conseils

Si vous souhaitez conserver une précision fixe, évitez d'utiliser des float et utilisez plutôt Decimal :

>>> 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top