Domanda

Ho un programma Python che legge valori in virgola mobile usando la seguente espressione regolare

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

una volta estratto il valore usando float (match.group (1)), ottengo il numero in virgola mobile effettivo. Tuttavia, non sono in grado di distinguere se il numero era 1,2345678 o 1,234 o 1,2340000.

Il problema che sto affrontando è stampare nuovamente il valore in virgola mobile, con la stessa formattazione esatta. Una soluzione semplice è "dividere e contare" il valore in virgola mobile quando è ancora una stringa, ad esempio che si divide in corrispondenza del punto decimale e contando la lunghezza della parte intera e la lunghezza della parte frazionaria, quindi creare il formatter come

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

ma forse conosci un modo standard per ottenere lo stesso risultato?

È stato utile?

Soluzione

Il tuo metodo è sostanzialmente corretto. La formattazione delle stringhe ha un operatore * meno usato che puoi mettere per le dimensioni di formattazione, ecco un po 'di codice:

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

e genera

1.2345678
1.234
1.2340000

Altri suggerimenti

Se vuoi mantenere una precisione fissa, evita di usare float se invece usa 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top