Pergunta

Eu tenho um programa python que lê valores de ponto flutuante usando a seguinte expressão regular

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

Uma vez eu extrair o flutuador valor utilizando (match.group (1)), eu recebo o número real de ponto flutuante. No entanto, eu não sou capaz de distinguir se o número foi de 1.2345678 ou 1.234 ou 1,2340000.

O problema que estou enfrentando é para imprimir o valor de ponto flutuante de novo, com exatamente a mesma formatação. Uma solução fácil é "dividir e contar" o valor do ponto flutuante quando ainda uma string, ex divisão no ponto decimal, e contando o comprimento parte inteira eo comprimento parte fracionária, em seguida, criar o formatador como

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

mas talvez você sabe uma maneira padrão para alcançar o mesmo resultado?

Foi útil?

Solução

método Você é basicamente correta. formatação de string tem um operador de * menos frequentemente utilizado você pode colocar para os tamanhos de formatação, aqui está algum código:

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 saídas

1.2345678
1.234
1.2340000

Outras dicas

Se você quiser manter uma precisão fixa, evite usar floats e uso Decimal vez:

>>> 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top