Pythonでの通貨のフォーマット


156

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

これどうやってするの?


以下のコメント@RailsS​​onで優れた点を述べました。特定の通貨を表示するために£を印刷したいが、財務数値に日本語の表現を使用してその表示を採用します。localeモジュールの通貨値の使用とその通貨の表示プロパティを分離することにより、リクエストが言語で実装されていないのは奇妙だと思います。
Droogans

回答:


212

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'

15
どのようにして非ネイティブ通貨を正しくフォーマットしますか?日本語レポートのコストをGBポンドで表示しているとしましょう。
SingleNegationElimination 2009

2
@TokenMacGuy:それはトリックの質問です。日本のレポートは、日本のコンマと小数点の位置規則を意味しますが、GBポンドの通貨記号です。カスタマイズされたロケール定義を作成する必要があります。
S.Lott、2009

提供者番号が負の場合、「()」の間の値を返します。なぜですか?
panchicore

6
これはまだ私にとってはうまくいきませんでしたが、私はそれをに変えてlocale.setlocale(locale.LC_ALL, 'en_US.UTF-8')、それは完全にうまくいきました!
Furbeenator 2011

2
@panchicore括弧で示される負の数の表記は、会計の世界では一般的な慣習です。oocalcまたはExcelで試して、数値を会計タイプにフォーマットします。
Droogans 2012年

94

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


6
それは素晴らしいですが、要求されたソリューションには通貨記号が含まれ、ロケール固有の小数点以下の桁数もハードコーディングしているため、実際には質問には答えません。カンマの配置だけが必要でない場合は、受け入れられたロケール応答を使用する理由が他にもたくさんあります。
mrooney 2013年

6
@mrooneyモジュール全体をインポートしないなど、受け入れられたロケールの回答を使用しない多くの理由もあります。
Josh、

1
@Josh、「ロケールインポート通貨から」。
Andrew H

5
@mrooney: '$ {:0、.2f}'。format(184467616.1)を実行するだけで、シンボル
triunenature

@triunenatureが原因になる$ 123,456.78こともあります。編集:
マークダウン

48

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

OPの例は次のとおりです。

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

2
非常に遅いメモ:これをテストすると、通貨が実際にフォーマットされているかどうかに関係なく、金額の前に適切な記号(設定されたロケールのように見えるものでフォーマットされている)が付けられているだけなので、インテリジェントにフォーマットされていないようです。そのシンボルを接頭辞として使用します。
kungphu 2015年

@kungphuどういう意味?babel.pocoo.org/en/latest/api/…を
ジュリアン

1
@Julianこれに対処するためのlocale引数をformat_currency使用できるようですが、それは4年前のドキュメントになかった(そのコメントを書いたとき)か、ドキュメントをチェックせずにこの回答のコードをそのままテストしました。
kungphu

1
@kungphu Gotcha。私は昨日のこの投稿の年齢に注意を払っていなかったに違いありません。ドキュメンテーション/機能の変更は非常にありそうです。乾杯!
ジュリアン

32

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

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

コード:

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

そして、元のポスターのために、明らかに、ちょうど切り替える$ために£


私のフォーマットにはいくつかのカスタマイズが必要でしたが、このソリューションでそれを行うことができたので、それで問題ありません。
DonkeyKong

10
クールなアイデア!Pythonの3.6とF-文字列で、それがさらに美しく見える:print(f'Value is: ${value:,.2f}'.replace('$-', '-$'))
ティモSaloranta

16

私のロケール設定は不完全であるように思われたので、私はこのSOの答えを超えて調べすぎて、次のことがわかりました。

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

OSに依存しない

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


しかし、どこで呼び出すのdef moneyfmt(value, places=2, curr='', sep=',', dp='.', pos='', neg='-', trailneg='')ですか?
Roel、

9

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')

2
locale.setlocale(locale.LC_ALL、 'en_US.UTF-8')は私に
役立ち


6

私があなただったら、BABELを使います:http : //babel.pocoo.org/en/latest/index.html

from babel.numbers import format_decimal


format_decimal(188518982.18, locale='en_US')

1
Pythonロケールモジュールは私には機能しませんでした(設定したロケールに関係なく、不満が出ました)が必要で、この関数を使用すると便利です。より多くのパラメーターとより便利な関数(通貨の場合などformat_currency)があるので、APIドキュメントを確認する価値があります。
ダニエルW.

3

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

私はそれを正しくするためにかなりの時間を費やしてきました、ロケールごとに異なる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で導入されました。


locale.currency()よりも優れていますか?
Ali Afshar

@AliAfshar:1つの利点はの10,50 kr代わりになりkr 10,50ます。
user2394284

2

#変数 'Total:'をこの '9,348.237'のような形式で出力する

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

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


1

上記のコードに触発されました: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


0

@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'

ほとんどの国では、金額の後に通貨記号を使用しており、逆ではありません。
ジョナス・ビストロム2017

@jonas多分それはほとんどの国が行うことですが、OPは金額の前にそれを持っていたため、私の回答でも金額の前にそれを持っています:)
mu無

0

シンプルな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)

1
あなたのコードは次のような文字列を返し"$2,129.1468284147656""$10,948.3742933""$1,0908"。文字列を文字化けします。
Eugene Gr。Philippov

はい、気づきませんでした。あなたもansを与えました。
Vanjith
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.