Mọi người đều cho thấy việc sử dụng các mã định dạng f
chuỗi được ngầm giả định rằng nó không quan trọng để ấn định số chữ số sau dấu thập phân. Điều đó có vẻ giống như một giả định rất run rẩy với tôi. Tuy nhiên, nếu bạn không đưa ra giả định đó, không có cơ chế tích hợp để thực hiện những gì bạn muốn. Đây là hack tốt nhất mà tôi đã đưa ra khi đối mặt với một vấn đề tương tự (trong một máy phát PDF - số trong PDF không thể sử dụng ký pháp mũ). Bạn có thể muốn lấy tất cả các chuỗi b
khỏi các chuỗi và có thể có các Python-isms khác ở đây.
_ftod_r = re.compile(
br'^(-?)([0-9]*)(?:\.([0-9]*))?(?:[eE]([+-][0-9]+))?$')
def ftod(f):
"""Print a floating-point number in the format expected by PDF:
as short as possible, no exponential notation."""
s = bytes(str(f), 'ascii')
m = _ftod_r.match(s)
if not m:
raise RuntimeError("unexpected floating point number format: {!a}"
.format(s))
sign = m.group(1)
intpart = m.group(2)
fractpart = m.group(3)
exponent = m.group(4)
if ((intpart is None or intpart == b'') and
(fractpart is None or fractpart == b'')):
raise RuntimeError("unexpected floating point number format: {!a}"
.format(s))
# strip leading and trailing zeros
if intpart is None: intpart = b''
else: intpart = intpart.lstrip(b'0')
if fractpart is None: fractpart = b''
else: fractpart = fractpart.rstrip(b'0')
if intpart == b'' and fractpart == b'':
# zero or negative zero; negative zero is not useful in PDF
# we can ignore the exponent in this case
return b'0'
# convert exponent to a decimal point shift
elif exponent is not None:
exponent = int(exponent)
exponent += len(intpart)
digits = intpart + fractpart
if exponent <= 0:
return sign + b'.' + b'0'*(-exponent) + digits
elif exponent >= len(digits):
return sign + digits + b'0'*(exponent - len(digits))
else:
return sign + digits[:exponent] + b'.' + digits[exponent:]
# no exponent, just reassemble the number
elif fractpart == b'':
return sign + intpart # no need for trailing dot
else:
return sign + intpart + b'.' + fractpart
bản sao có thể có của [In số phao ở dạng bình thường, không phải số mũ] (http://stackoverflow.com/questions/7801586/print-a-float-number-in-normal-form-not-exponential) –