15

問題はPython2.6であり、それが本番環境にあります。

数値(1234567.0987や1234567.0など)をコンマでフォーマットし、小数点以下の桁数を指定するには、この要件があります。したがって、精度が3の場合、1234567.0987は1,234,567.099のようになります。

多くの質問への回答で示唆されているように、ロケールを使用してみましたが、問題は小数点以下2桁になることであり、これは私の要件には受け入れられません。

他の場所で検索しようとしましたが、解決策が見つかりませんでした。最後に、自分でメソッドを作成しました。

def format_float(value, precision = 4):
    formatString = "%0." + str(precision) + "f"    
    str_val =  formatString % value
    first, second = str_val.split('.')
    first = int(first)
    group = []
    while True:
        result, mod = first / 1000, first % 1000
        group.append(str(mod))
        if result == 0:
            break
        first = result
    group.reverse() 
    return ','.join(group) + '.' + second

メソッドをテストするためにいくつかのテストを実行しようとしましたが、正常に機能します。

# default 4 digits precision
assert format_float(1234567890.0876543) == '1,234,567,890.0877'
assert format_float(1.2) == '1.2000'
assert format_float(1234) == '1,234.0000'
assert format_float(0) == '0.0000'

# 3 digits precision
assert format_float(1234567890.0876543, precision=3) == '1,234,567,890.088'
assert format_float(0, precision=3) == '0.000'

Pythonを初めて使用するので、私の質問は、これが許容できるソリューションであるかどうかです。このフォーマットはタイトなforループで何度も実行する必要があるため、誰かがより良い解決策を指摘できれば幸いです。

みなさん、ありがとうございました

4

2 に答える 2

33

str.formatPython 2.7および3.xでは、これに使用できます。

>>> num = 1234567890.0876543
>>> "{0:,f}".format(num)
'1,234,567,890.087654'
>>> "{0:,.2f}".format(num)
'1,234,567,890.08'
>>> "{0:,f}".format(1234)
'1,234.000000'
于 2012-10-10T16:30:04.800 に答える
23

ロケールモジュールを十分に詳しく調べていないと思います。 locale.format()必要なものですが、最初にロケールを設定するようにしてください。そうしないと、グループ化がまったく行われません。

>>> locale.setlocale(locale.LC_ALL, '')
'en_US.UTF-8'
>>> locale.format("%.4f", 12345.678912, grouping=True)
'12,345.6789'
于 2012-10-10T16:30:57.537 に答える