Yanıtlar:
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'
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
ve mükemmel çalıştı!
>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'
$ 123,456.78
bazen olsa sonuçlanır . Düzenleme: markdown ekstra alanları kaplıyor, $ ve sayılar arasında daha fazlası varmış gibi davran
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
locale
argü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.
Bu eski bir yazı, ama ben sadece şu çözümü uyguladım:
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£
print(f'Value is: ${value:,.2f}'.replace('$-', '-$'))
Yerel ayarlarım eksik görünüyordu, bu yüzden bu SO cevabının ötesine baktım ve buldum:
http://docs.python.org/library/decimal.html#recipes
OS-bağımsız
Sadece burada paylaşmak istedim.
def moneyfmt(value, places=2, curr='', sep=',', dp='.', pos='', neg='-', trailneg='')
?
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')
"{: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
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')
format_currency
).
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ı.
10,50 kr
yerine bir avantaj olurdu kr 10,50
.
#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.
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
Aynı şeye bakmaya geldim ve python-paranın henüz gerçekten kullanılmadığını gördüm ama belki ikisinin bir karışımı iyi olurdu
@ 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'
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)
"$2,129.1468284147656"
, "$10,948.3742933"
, "$1,0908"
. Dizeyi sarar.
locale
Modü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 .