Python'da para birimi biçimlendirme


155

Python kullanarak 188518982.18 - £ 188.518.982.18 gibi bir sayıyı biçimlendirmek istiyorum.

Bunu nasıl yapabilirim?


Aşağıdaki yorumda mükemmel bir noktaya işaret ettiniz @RailsSon: Belirli bir para birimini görüntülemek için £ s yazdırmak istiyorsunuz, ancak bu ekranı finansal numaralar için Japonca bir ifade kullanarak kullanmak istiyorsunuz. localeModülün para birimi değeri kullanımını ve o para biriminin görüntüleme özelliklerini birbirinden ayırarak isteğinizin dilde uygulanmadığını garip buluyorum .
Droogans

Yanıtlar:


212

Yerel ayar modülüne bakın .

Bu, para birimi (ve tarih) biçimlendirmesi yapar.

>>> 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
Anadili olmayan bir para birimini nasıl doğru şekilde biçimlendiririm, bir Japonca dil raporu için GB pound olarak bir maliyet gösterdiğimi varsayalım?
Temmuz09

2
@TokenMacGuy: Bu bir hile sorusu. Japon raporu, Japon virgül ve ondalık basamak kuralları anlamına gelir, ancak GB Pound para birimi simgesi - Locale tarafından önemsiz bir şekilde desteklenmez. Özelleştirilmiş bir yerel ayar tanımı oluşturmanız gerekir.
S.Lott

verici sayısı negatifse "()" arasındaki değeri neden döndürür?
panchicore

6
Bu hala benim için işe yaramadı, ama ben değiştirdim locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')ve mükemmel çalıştı!
Furbeenator

2
@panchicore negatif sayılar için parantezle gösterilen gösterim, muhasebe dünyasında yaygın bir uygulamadır. Oocalc veya excel'de deneyin ve sayıları muhasebe türüne göre biçimlendirin.
Droogans

94

2.7 sürümündeki yenilikler

>>> '{: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
Bu düzgün ancak soruyu gerçekten cevaplamıyor, çünkü istenen çözüm bir para birimi simgesi içerecektir ve ayrıca ondalıktan sonraki basamak sayısını, yerel ayara özgü olarak zor kodluyorsunuz. Yalnızca virgül yerleşimi istemiyorsanız, kabul edilen yerel ayar yanıtını kullanmanın daha birçok nedeni vardır.
mrooney

6
@mrooney Kabul edilen yerel yanıtı kullanmamanız gibi bir modülün tamamını içe aktarmamak gibi birçok neden vardır.
Josh

1
@Josh, "yerel ithalat para biriminden".
Andrew H

5
@mrooney: Şunu yapabilirsiniz: '$ {: 0, .2f}'. formatı (184467616.1) ve şimdi sembolünüz var
triunenature

@triunenature $ 123,456.78bazen olsa sonuçlanır . Düzenleme: markdown ekstra alanları kaplıyor, $ ve sayılar arasında daha fazlası varmış gibi davran
CyberJacob

49

Neden daha fazla çevrimiçi (veya bu konu üzerinde) belirtilmediğinden emin değilim, ancak Edgewall adamlarından Babel paketi (ve Django yardımcı programları) para birimi biçimlendirme (ve diğer birçok i18n görevi) için harika. Güzeldir çünkü çekirdek Python yerel ayar modülü gibi küresel olarak her şeyi yapma ihtiyacından muzdarip değildir.

OP'nin verdiği örnek şöyle olacaktır:

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

2
Çok geç not: Bunu test ederken, para birimini akıllıca biçimlendirdiği görülmüyor, çünkü bu para biriminin gerçekte olup olmadığına bakılmaksızın, uygun simgeyi miktardan önce (belirlediğiniz yerel ayar olarak görünenle biçimlendirilmiş) biçimlendiriyor sembolünü önek olarak kullanır.
kungphu

@kungphu Ne demek istiyorsun? Bkz. Babel.pocoo.org/tr/latest/api/…
Julian

1
@Julian Bunu ele almak için kullanılabilecek bir localeargüman gibi görünüyor format_currency, ama ya dört yıl önce dokümanda olmayan (bu yorumu yazdığımda) ya da sadece bu cevap kodunu dokümanı kontrol etmeden olduğu gibi test ettim.
kungphu

1
@kungphu Gotcha. Dün bu yazının yaşına dikkat etmemeliydim. Dokümantasyon / fonksiyon değişikliği çok muhtemel görünüyor. Şerefe!
Julian

32

Bu eski bir yazı, ama ben sadece şu çözümü uyguladım:

  • Harici modüller gerektirmez
  • Yeni bir işlev oluşturmayı gerektirmez
  • Sıralı olarak yapılabilir
  • Birden çok değişkeni işler
  • Negatif dolar tutarlarını yönetir

Kod:

num1 = 4153.53
num2 = -23159.398598

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

Çıktı:

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

Ve orijinal poster için, belli ki, sadece geçiş $için£


formatımın bazı özelleştirmelere ihtiyacı vardı, ama sorun değil çünkü bunu bu çözümle yapabildim.
DonkeyKong

10
İyi fikir! Python 3.6 ve f-stringleri ile daha da güzel görünüyor:print(f'Value is: ${value:,.2f}'.replace('$-', '-$'))
Timo Saloranta


9

OSX kullanıyorsanız ve henüz yerel ayar modülünüzü ayarlamanız gerekiyorsa, bu ilk yanıt çalışmayacaktır: Aşağıdaki hatayı alırsınız:

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.

Bunu düzeltmek için aşağıdakileri kullanmanız gerekecektir:

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

2
locale.setlocale (locale.LC_ALL, 'en_US.UTF-8') benim için yapıyor
alexblum

9

"{:0,.2f}".format(float(your_numeric_value))Python 3'te bu işi yapar; aşağıdaki satırlardan biri gibi bir şey verir:

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

6

Siz olsaydım, BABEL kullanırdım: http://babel.pocoo.org/en/latest/index.html

from babel.numbers import format_decimal


format_decimal(188518982.18, locale='en_US')

1
Python yerel ayar modülü benim için işe yaramadı (ne olursa olsun yerel ayarladım, şikayet ettim) ama babil gerektiren ve bu işlevi kullanmak güzel. Daha fazla parametre ve daha kullanışlı işlevler olduğu için API belgelerine bakmaya değer (para birimleri için: gibi format_currency).
Daniel W.

3

Oh, bu ilginç bir canavar.

Bunu doğru yapmak için hatırı sayılır bir zaman geçirdim, yerel ayardan yerel ayara farklılık gösteren üç ana sorun var: - para birimi simgesi ve yönü - binlik ayırıcı - ondalık nokta

Kivi python çerçevesinin bir parçası olan bunun oldukça kapsamlı bir uygulamamı yazdım, LGPL: ed kaynağına buradan bakın:

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

Kod biraz Linux / Glibc'ye özgüdür, ancak pencerelere veya diğer unixlere kabul etmek çok zor olmamalıdır.

Bunu yükledikten sonra aşağıdakileri yapabilirsiniz:

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

Hangi sonra size verecektir:

'$10.50'

veya

'10,50 kr'

Seçili olan yerel ayara bağlı olarak.

Bu yazının ötekine göre ana noktası, python'un eski sürümleriyle çalışacağıdır. locale.currency, python 2.5'te tanıtıldı.


Locale.currency () 'a göre avantajları var mı?
Ali Afshar

@AliAfshar: Bunun 10,50 kryerine bir avantaj olurdu kr 10,50.
user2394284

2

#princess 'Total:' değişkenine '9,348.237' biçimindeki bir biçimde yazdırma

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

burada '{: 7, .3f}', bu durumda sayıyı biçimlendirmek için boşluk sayısıdır, 3 ondalık noktalı bir milyondur. Sonra '.format (zum1)' i ekleyin. Zum1, benim özel programımdaki tüm sayıların toplamı için büyük bir sayıya sahip olan bir değişkendir. Değişken kullanmaya karar verdiğiniz herhangi bir şey olabilir.


1

Yukarıdaki koddan ilham alan: 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'in cevabının yardımıyla bir fonksiyonun içinde hesaplamak için bir lambda

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

ve sonra,

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

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

Çoğu ülke para birimi sembolünü tutardan sonra kullanır, tersi değil.
Jonas Byström

@jonas Belki de çoğu ülke bunu yapar, ama OP miktarından önce vardı, bu yüzden de benim cevap tutarından önce aldım :)
mu 無

0

Basit python kodu!

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
Kodunuz döner dizeleri gibi "$2,129.1468284147656", "$10,948.3742933", "$1,0908". Dizeyi sarar.
Eugene Gr. Philippov

Evet fark etmedim. Sen de ans verdin.
Vanjith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.