回答:
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'
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
、それは完全にうまくいきました!
>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'
$ 123,456.78
こともあります。編集:
なぜそれがよりオンラインで(またはこのスレッドで)言及されていないのかはよくわかりませんが、Edgewallの連中のBabelパッケージ(およびDjangoユーティリティ)は、通貨のフォーマット(および他の多くのi18nタスク)に最適です。コアのPythonロケールモジュールのようにグローバルにすべてを実行する必要がないため、すばらしいです。
OPの例は次のとおりです。
>>> import babel.numbers
>>> import decimal
>>> babel.numbers.format_currency( decimal.Decimal( "188518982.18" ), "GBP" )
£188,518,982.18
locale
引数をformat_currency
使用できるようですが、それは4年前のドキュメントになかった(そのコメントを書いたとき)か、ドキュメントをチェックせずにこの回答のコードをそのままテストしました。
これは古い投稿ですが、私は次のソリューションを実装しました:
コード:
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
そして、元のポスターのために、明らかに、ちょうど切り替える$
ために£
print(f'Value is: ${value:,.2f}'.replace('$-', '-$'))
私のロケール設定は不完全であるように思われたので、私はこのSOの答えを超えて調べすぎて、次のことがわかりました。
http://docs.python.org/library/decimal.html#recipes
OSに依存しない
ここで共有したかっただけです。
def moneyfmt(value, places=2, curr='', sep=',', dp='.', pos='', neg='-', trailneg='')
ですか?
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')
"{:0,.2f}".format(float(your_numeric_value))
Python 3ではその仕事をします。次の行のいずれかが表示されます。
10,938.29
10,899.00
10,898.99
2,328.99
私があなただったら、BABELを使います:http : //babel.pocoo.org/en/latest/index.html
from babel.numbers import format_decimal
format_decimal(188518982.18, locale='en_US')
format_currency
)があるので、APIドキュメントを確認する価値があります。
ああ、それは面白い獣です。
私はそれを正しくするためにかなりの時間を費やしてきました、ロケールごとに異なる3つの主な問題があります:-通貨記号と方向-千の区切り-小数点
私はこれの独自のかなり広範囲な実装を記述しました。これはキウイパイソンフレームワークの一部です。LGPL:edソースをチェックしてください:
http://svn.async.com.br/cgi-bin/viewvc.cgi/kiwi/trunk/kiwi/currency.py?view=markup
コードはわずかにLinux / Glibc固有ですが、ウィンドウや他のunixに採用するのは難しくありません。
インストールしたら、次の操作を実行できます。
>>> from kiwi.datatypes import currency
>>> v = currency('10.5').format()
それからあなたに与えるでしょう:
'$10.50'
または
'10,50 kr'
現在選択されているロケールによって異なります。
この投稿が他の投稿よりも重要な点は、古いバージョンのpythonで動作することです。locale.currencyはpython 2.5で導入されました。
10,50 kr
代わりになりkr 10,50
ます。
上記のコードに触発されました:D
def money_format(value):
value = str(value).split('.')
money = ''
count = 1
for digit in value[0][::-1]:
if count != 3:
money += digit
count += 1
else:
money += f'{digit},'
count = 1
if len(value) == 1:
money = ('$' + money[::-1]).replace('$-','-$')
else:
money = ('$' + money[::-1] + '.' + value[1]).replace('$-','-$')
return money
私は同じことを見てきましたが、python-moneyはまだ実際には使用していませんが、おそらく2つを組み合わせた方が良いでしょう。
@Nateの答えの助けを借りて、関数内で計算するためのラムダ
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'
シンプルな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)
"$2,129.1468284147656"
、"$10,948.3742933"
、"$1,0908"
。文字列を文字化けします。
locale
モジュールの通貨値の使用とその通貨の表示プロパティを分離することにより、リクエストが言語で実装されていないのは奇妙だと思います。