сохраняя одинаковое форматирование для значений с плавающей точкой - PullRequest
1 голос
/ 29 апреля 2009

У меня есть программа на Python, которая читает значения с плавающей запятой, используя следующее регулярное выражение

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

как только я извлекаю значение с помощью float (match.group (1)), я получаю фактическое число с плавающей запятой. Однако я не могу различить, было ли это число 1,2345678 или 1,234 или 1,2340000.

Проблема, с которой я сталкиваюсь, состоит в том, чтобы снова распечатать значение с плавающей запятой с точно таким же форматированием. Простое решение состоит в том, чтобы «разделить и посчитать» значение с плавающей запятой, когда оно все еще является строкой, например, разделение в десятичной запятой и подсчитать длину целой части и длину дробной части, а затем создать форматер как 1008 *

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

но, может быть, вы знаете стандартный способ достижения того же результата?

Ответы [ 3 ]

8 голосов
/ 29 апреля 2009

Если вы хотите сохранить фиксированную точность, избегайте использования float s и используйте Decimal вместо:

>>> from decimal import Decimal
>>> d = Decimal('-1.2345')
>>> str(d)
'-1.2345'
>>> float(d)
-1.2344999999999999
3 голосов
/ 29 апреля 2009

Ваш метод в основном правильный. Форматирование строк имеет менее часто используемый оператор *, который вы можете использовать для форматирования, вот код:

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

и выводит

1.2345678
1.234
1.2340000
1 голос
/ 29 апреля 2009
>>> from decimal import Decimal as d
>>> d('1.13200000')
Decimal('1.13200000')
>>> print d('1.13200000')
1.13200000
...