web-dev-qa-db-ja.com

Pythonの通貨フォーマット

Pythonを使用して、188518982.18のような数値を188,518,982.18にフォーマットしようとしています。

これどうやってするの?

136
RailsSon

locale モジュールを参照してください。

これは通貨(および日付)のフォーマットを行います。

>>> import locale
>>> locale.setlocale( locale.LC_ALL, '' )
'English_United States.1252'
>>> locale.currency( 188518982.18 )
'$188518982.18'
>>> locale.currency( 188518982.18, grouping=True )
'$188,518,982.18'
183
S.Lott

2.7の新機能

>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'

http://docs.python.org/dev/whatsnew/2.7.html#pep-0378

88
nate c

オンライン(またはこのスレッド)でこれ以上言及されていない理由はよくわかりませんが、Edgewallの Babel パッケージ(およびDjangoユーティリティ)は通貨のフォーマット(および多くの他のi18nタスクの)。コアPythonロケールモジュールのようにすべてをグローバルに実行する必要がないため、これは素晴らしいことです。

OPが示した例は次のようになります。

>>> import babel.numbers
>>> import decimal
>>> babel.numbers.format_currency( decimal.Decimal( "188518982.18" ), "GBP" )
£188,518,982.18
40
glenc

これは古代の投稿ですが、私は次のソリューションを実装しました:

  • 外部モジュールは必要ありません
  • 新しい関数を作成する必要はありません
  • インラインで行うことができます
  • 複数の変数を処理します
  • 負の金額を処理します

コード:

num1 = 4153.53
num2 = -23159.398598

print 'This: ${:0,.0f} and this: ${:0,.2f}'.format(num1, num2).replace('$-','-$')

出力:

This: $4,154 and this: -$23,159.40

元のポスターの場合、明らかに、$£に切り替えるだけです

23
elPastor

ロケール設定が不完全であるように思えたので、このSOの答えを超えて見て、見つけました:

http://docs.python.org/library/decimal.html#recipes

OSに依存しない

ここで共有したかっただけです。

16
user37986

OSXを使用していて、ロケールモジュール設定をまだ設定していない場合、この最初の回答が機能しない場合、次のエラーが表示されます。

Traceback (most recent call last):File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/locale.py", line 221, in currency
raise ValueError("Currency formatting is not possible using "ValueError: Currency formatting is not possible using the 'C' locale.

これを修正するには、次を使用する必要があります。

locale.setlocale(locale.LC_ALL, 'en_US')
9
simoes

もし私があなただったら、私はBABELを使うでしょう: http://babel.pocoo.org/en/latest/index.html

from babel.numbers import format_decimal


format_decimal(188518982.18, locale='en_US')
3
Carlos

ああ、それは面白い獣です。

私はそれを正しくするためにかなりの時間を費やしました、ロケールごとに異なる3つの主要な問題があります:-通貨記号と方向-千の区切り-小数点

Kiwi pythonフレームワークの一部であるこの独自のかなり大規模な実装を作成しました。LGPL:edソースをチェックしてください:

http://svn.async.com.br/cgi-bin/viewvc.cgi/kiwi/trunk/kiwi/currency.py?view=markup

コードはわずかにLinux/Glibc固有ですが、Windowsや他のUNIXに採用するのはそれほど難しくないはずです。

それをインストールしたら、次のことができます。

>>> from kiwi.datatypes import currency
>>> v = currency('10.5').format()

それはあなたに与えます:

'$10.50'

または

'10,50 kr'

現在選択されているロケールに応じて。

この投稿が他の記事よりも重要な点は、古いバージョンのpythonで動作することです。 locale.currencyはpython 2.5で導入されました。

3
Johan Dahlin

#変数「Total:」をこの「9,348.237」のような形式で印刷する

print ('Total:',   '{:7,.3f}'.format(zum1))

ここで、「{:7、.3f}」は、この場合の数値をフォーマットするためのスペースの数であり、小数点以下3桁で100万です。次に、 '。format(zum1)を追加します。 zum1は、特定のプログラムのすべての数の合計に対して大きな数を持つ変数です。変数には、使用することを決定した任意のものを指定できます。

1
Marie

私は同じものを見るようになりました python-money はまだ実際には使用されていませんが、おそらく2つの組み合わせが良いでしょう

0
James Brooks

@ Nate's answer の助けを借りて、関数内で計算するためのラムダ

converter = lambda amount, currency: "%s%s%s" %(
    "-" if amount < 0 else "", 
    currency, 
    ('{:%d,.2f}'%(len(str(amount))+3)).format(abs(amount)).lstrip())

その後、

>>> converter(123132132.13, "$")
'$123,132,132.13'

>>> converter(-123132132.13, "$")
'-$123,132,132.13'
0
mu 無

Python 3の"{:0,.2f}".format(float(your_numeric_value))は仕事をします。次のいずれかの行が出力されます。

10,938.29
10,899.00
10,898.99
2,328.99

シンプルpythonコード!

def format_us_currency(value):
    value=str(value)
    if value.count(',')==0:
        b,n,v='',1,value
        value=value[:value.rfind('.')]
        for i in value[::-1]:
            b=','+i+b if n==3 else i+b
            n=1 if n==3 else n+1
        b=b[1:] if b[0]==',' else b
        value=b+v[v.rfind('.'):]
    return '$'+(value.rstrip('0').rstrip('.') if '.' in value else value)
0
Vanjith