garder le même formatage pour les valeurs à virgule flottante
-
03-07-2019 - |
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?
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