1

私はこれを正しく行っていると確信していますが、Python 2.7.3 文字列フォーマットのミニ言語から期待する結果が得られません。float の出力を 3 つの整数値とさまざまな数の 10 進数値にフォーマットしようとしています。整数値以外はすべて機能します。

それだけで、次のコードは 3 つの整数値を取得するために機能します...

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

returns '003'

そしてフロートは機能します...

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

returns '3.12'

ただし、この 2 つを組み合わせると、適切に機能しないようです。小数精度は機能しますが、整数精度は機能しません...

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...

繰り返しますが、これはすべて完全に機能しますが、整数値を float 精度と組み合わせると 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 に答える