2012-10-10 9 views
6

問題は、本番環境でのPython 2.6の問題です。Pythonでカンマと指定された精度の数字をフォーマットする方法

私はカンマで数字(1234567.0987または1234567.0のような)をフォーマットし、小数点以下の桁数を指定するためのこの要件を持っています。したがって、精度が3の場合、1234567.0987は1,234,567.099のように見えます。

ロケールを使用しようとしましたが、多くの質問に対する回答で示唆されているように、10進数の後に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' 

私は、これが許容可能な解決策であるかどうかということです。このフォーマットは厳しいfor-loopで何度も行わなければならないので、誰かがより良い解決策を指すことができるのであれば、私は感謝しています。あなたが何か行うことができますのpython 2.7および3.xのすべての

+2

「1000000」と試してください。 –

+0

マーク、ありがとうございます。それはすぐそこに一つの良いバグです、私はこれを修正する必要があります。 – cspider

+1

'locale'モジュールを使う必要はありません。 Pythonの整数にコンマを追加する最も簡単な方法は?_(http://stackoverflow.com/q/3909457/355230) – martineau

答えて

18

は、私はあなたのロケールモジュールに十分な深さに見えたとは思いません。 locale.format()が必要ですが、ロケールを最初に設定することを忘れないでください。そうしないと、グループ化されません。

>>> locale.setlocale(locale.LC_ALL, '') 
'en_US.UTF-8' 
>>> locale.format("%.4f", 12345.678912, grouping=True) 
'12,345.6789' 
+0

ロケール対応のFTW ... –

+1

+1は 'locale'モジュールを知りませんでした。 –

+0

@cdhowie、ありがとう、これは、私のために、でも働いています。私はformat()オプションを書いた。 – cspider

12

おかげで、よろしく:

>>> 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' 
+0

ああ、私にそれを打つ。ちなみに、これも2.7.3で動作します – kreativitea

+0

@kreativiteaただそれがオンラインでチェックしました。私はPython 2.6上でのみ、それがうまくいきませんでした。 –

+0

しかし、私はオリジナルの質問を編集しました。その質問はPython 2.6です。 – cspider

関連する問題