2009-04-28 4 views
1

J'ai un programme python qui lit les valeurs à virgule flottante en utilisant l'expression régulière suivantegardant même mise en forme pour virgule flottante des valeurs

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

une fois que j'extraire la valeur à l'aide flotteur (match.group (1)), je reçois le nombre réel à virgule flottante. Cependant, je ne suis pas capable de distinguer si le nombre était 1.2345678 ou 1.234 ou 1.2340000.

Le problème auquel je fais face est d'imprimer à nouveau la valeur de virgule flottante, avec exactement le même formatage. Une solution simple consiste à « split et compter » la valeur en virgule flottante quand un cordage, par exemple fractionnement à la virgule décimale, et en comptant la partie entière longueur et la longueur de la partie fractionnaire, puis créer le formateur comme

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

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

Répondre

3

méthode est fondamentalement correcte. le formatage de a moins souvent utilisé * opérateur, vous pouvez mettre les tailles de mise en forme, voici un 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 sorties

1.2345678 
1.234 
1.2340000 
8

Si vous voulez garder une précision fixe, évitez d'utiliser float s et utiliser à la place Decimal:

>>> from decimal import Decimal 
>>> d = Decimal('-1.2345') 
>>> str(d) 
'-1.2345' 
>>> float(d) 
-1.2344999999999999 
+0

Cool, je ne le savais pas! –

+0

Mieux encore, gardez-le comme une ficelle aussi longtemps que possible. –

1
>>> from decimal import Decimal as d 
>>> d('1.13200000') 
Decimal('1.13200000') 
>>> print d('1.13200000') 
1.13200000 
Questions connexes