1

我很确定我做对了,但没有从 Python 2.7.3 字符串格式化迷你语言中得到我期望的结果。我正在尝试将浮点数的输出格式化为 3 个整数值和不同数量的十进制值。除整数值外,一切正常。

就其本身而言,以下代码可以让我获得 3 个整数值......

num = 3
value = '{:03}'.format(num)

returns '003'

和花车工作...

num = 3.12345
value = '{:01.2f}'.format(num)

returns '3.12'

但是,将两者结合起来似乎无法正常工作。小数精度有效,但整数精度不...

num = '3.12345'
value = '{:03.2f}'.format(num)

returns '3.12'

instead of the expected '003.12'

如果我尝试以下任何一种格式,情况也是如此......

value = '{:03.02f}'.format(num)
- or -
value = '{0:3.2f}'.format(num)
- or -
value = '{:3.02f}'.format(num)
- or -
value = '{0:3.02f}'.format(num)
- or -
value = '{0:03.2f}'.format(num)
- or -
value = '{0:03.02f}'.format(num)
- or -
value = '{:0>3.2f}'.format(num)
etc...

Which all return the same '3.12' instead of '003.12'

如果您对我为可变/动态小数精度所做的事情感到好奇,关键是要保持所有值的长度相同,但不同的值集可能不具有相同的精度。所以我取最长精度值或 10 中较小的一个,并强制其他人像这样匹配..

from decimal import Decimal

dVals = [
    abs(Decimal(val1).as_tuple().exponent), # Get the number of decimal points
    abs(Decimal(val2).as_tuple().exponent), # "" ""
    abs(Decimal(val3).as_tuple().exponent), # "" ""
    abs(Decimal(val4).as_tuple().exponent), # "" ""
    ]

    p = max(dVals)  # Get the largest value
    p = min(p, 10)  # Get the smaller of the largest value or 10

vals = [val1, val2, val3, val4]

for val in vals:
    value = '{:0>3.{prec}f}'.format(val, prec = p)
    # do whatever with value here...

同样,这一切都完美无缺,除了当我将整数值与浮点精度结合时,它永远不会返回 3 个精度位置。因此,我为确保输出具有相同格式长度的值所做的所有努力都是徒劳的。最终,输出应该类似于...

'009.123456700'
'180.101010101'
'054.987654321'

相反,它看起来像这样......

'9.123456700'
'180.101010101'
'54.987654321'

换句话说,丑陋。:-|

至少,我会接受以下输出......

'  9.123456700'
'180.101010101'
' 54.987654321'

有什么想法我在这里做错了吗?非常感谢您的帮助!

问候,

-RMW混沌

4

2 回答 2

6

第一个数字是结果的总宽度,而不是小数点前的宽度。

>>> '{:06.2f}'.format(3.12345)
'003.12'
于 2012-06-07T15:05:40.983 回答
1
num = '3.12345'
value = '{:03.2f}'.format(num)

这里03考虑了所有数字(包括浮点本身)。所以你应该做这样的事情:

value = '{:06.2f}'.format(num)

这会让你:'003.12'

计算此字符串'003.12'中的所有内容,结果为 6。但是您使用的 3 甚至比最小表示的计数还要少,这就是您得到的原因'3.12'

于 2012-06-07T15:16:06.957 回答