2009-04-28 3 views
1

ich ein Python-Programm haben, die Werte Punkt mit dem folgenden regulären Ausdruck liest floatinggleiche Formatierung für Fließkomma halten Werte

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

sobald ich den Wert mit Schwimmer (match.group (1)) zu extrahieren, ich die tatsächliche Gleitkommazahl. Ich kann jedoch nicht unterscheiden, ob die Nummer 1,2345678 oder 1,234 oder 1,2340000 war.

Das Problem, mit dem ich konfrontiert bin, ist, den Gleitkommawert wieder auszugeben, mit der exakt gleichen Formatierung. Eine einfache Lösung ist es, „Split und zählen“, um den Fließkommawert, wenn noch eine Zeichenfolge, zB Spaltung am Dezimalpunkt und Zählen der ganzzahlige Teil der Länge und den Bruchteil der Länge, dann als

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

aber vielleicht kennen Sie einen Standard Weg, um das gleiche Ergebnis zu erzielen?

Antwort

3

Sie Methode grundsätzlich richtig ist. String-Formatierung eine weniger häufig verwendete * Operator hat Sie für die Formatierung Größen setzen können, hier einige 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') 

und es gibt

1.2345678 
1.234 
1.2340000 
8

Wenn Sie eine feste Präzision beibehalten wollen, vermeiden Sie float s und verwenden Decimal statt:

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

Cool, ich wusste nicht, dass! –

+0

Besser noch, halten Sie es so lange wie möglich als String. –

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