سؤال

لدي برنامج بيثون أن يقرأ النقطة العائمة القيم باستخدام التعبير العادي التالي

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

بمجرد استخراج القيمة باستخدام تعويم(المباراة.المجموعة(1)) ، أحصل على الفعلية النقطة العائمة عدد.ومع ذلك أنا لست قادرا على التمييز إذا كان عدد 1.2345678 أو 1.234 أو 1.2340000.

المشكلة أواجهها لطباعة قيمة النقطة العائمة مرة أخرى مع نفس التنسيق.حل سهل هو "تقسيم العد" قيمة النقطة العائمة عندما لا تزال سلسلة ، على سبيل المثال تقسيم في العشرية و عد جزء صحيح من طول الجزء الكسري طول ، ثم إنشاء المنسق كما

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

ولكن ربما كنت أعرف طريقة قياسية لتحقيق نفس النتيجة ؟

هل كانت مفيدة؟

المحلول

هل الطريقة صحيحة في الأساس.سلسلة التنسيق لديها أقل في كثير من الأحيان تستخدم * المشغل يمكنك وضع على التنسيق الأحجام ، وإليك بعض التعليمات البرمجية:

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

نصائح أخرى

إذا كنت ترغب في الحفاظ على الدقة ثابتة ، تجنب استخدام floats واستخدام 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top