การจัดรูปแบบสกุลเงินใน Python


155

ฉันต้องการจัดรูปแบบตัวเลขเช่น 188518982.18 ถึง£ 188,518,982.18 โดยใช้ Python

ฉันจะทำสิ่งนี้ได้อย่างไร


คุณทำคะแนนได้อย่างยอดเยี่ยมในความคิดเห็นด้านล่าง @RailSon: คุณต้องการพิมพ์£ s เพื่อแสดงสกุลเงินที่เฉพาะเจาะจง แต่ใช้การแสดงผลนั้นโดยใช้นิพจน์ภาษาญี่ปุ่นสำหรับตัวเลขทางการเงิน ฉันคิดว่ามันแปลกที่คำขอของคุณไม่ได้ดำเนินการในภาษาโดยการแยกการlocaleใช้ค่าสกุลเงินของโมดูลและคุณสมบัติการแสดงผลของสกุลเงินนั้น
Droogans

คำตอบ:


212

ดูโมดูลสถานที่

การจัดรูปแบบสกุลเงิน (และวันที่) นี้

>>> 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
ฉันจะจัดรูปแบบสกุลเงินที่ไม่ใช่เจ้าของภาษาได้อย่างถูกต้องว่าฉันแสดงต้นทุนเป็นปอนด์ปอนด์สำหรับรายงานภาษาญี่ปุ่นได้อย่างไร
SingleNegationElimination

2
@TokenMacGuy: นั่นเป็นคำถามเคล็ดลับ รายงานภาษาญี่ปุ่นหมายถึงกฎจุลภาคและทศนิยมของญี่ปุ่น แต่สัญลักษณ์สกุลเงินปอนด์ปอนด์ไม่สนับสนุนโดย Locale คุณต้องสร้างนิยามสถานที่ที่กำหนดเอง
S.Lott

ถ้าจำนวนผู้ให้เป็นลบจะส่งกลับค่าระหว่าง "()" ทำไม
panchicore

6
สิ่งนี้ยังใช้ไม่ได้สำหรับฉัน แต่ฉันเปลี่ยนเป็นlocale.setlocale(locale.LC_ALL, 'en_US.UTF-8')และใช้งานได้อย่างสมบูรณ์แบบ!
Furbeenator

2
@panchicore สัญกรณ์สำหรับตัวเลขติดลบตามที่แสดงในวงเล็บเป็นหลักปฏิบัติทั่วไปในโลกของการบัญชี ลองใช้ใน oocalc หรือ excel และจัดรูปแบบตัวเลขเป็นประเภทการบัญชี
Droogans

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

6
@money มันมีหลายเหตุผลที่ไม่ควรใช้คำตอบของสถานที่ที่ยอมรับเช่นการไม่นำเข้าโมดูลทั้งหมด
Josh

1
@Josh, "จากสกุลเงินที่นำเข้าของสถานที่"
Andrew H

5
@money เงิน: คุณสามารถทำได้: '$ {: 0, .2f}'. รูปแบบ (184467616.1), และตอนนี้คุณมีสัญลักษณ์แล้ว
triunenature

@tununenature ที่จะส่งผลให้$ 123,456.78บางครั้งแม้ว่า แก้ไข: markdown ใช้ช่องว่างเพิ่มเติมหลอกว่ามีมากขึ้นระหว่าง $ และตัวเลข
CyberJacob

49

ไม่แน่ใจว่าทำไมไม่พูดถึงออนไลน์เพิ่มเติม (หรือในหัวข้อนี้) แต่แพ็คเกจBabel (และโปรแกรมอรรถประโยชน์ Django) จาก Edgewall guys ยอดเยี่ยมสำหรับการจัดรูปแบบสกุลเงิน (และงานอื่น ๆ อีกมากมายของ i18n) เป็นเรื่องที่ดีเพราะมันไม่ได้รับผลกระทบจากความต้องการที่จะทำทุกสิ่งทั่วโลกเช่นเดียวกับโมดูลภาษา Python

ตัวอย่างของ OP ที่ให้มาก็คือ:

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

2
ข้อสังเกตที่ล่าช้ามาก: ทดสอบสิ่งนี้ดูเหมือนว่าจะไม่ได้จัดรูปแบบสกุลเงินอย่างชาญฉลาดเพราะเพียงแค่ติดสัญลักษณ์ที่เหมาะสมก่อนจำนวนเงิน (จัดรูปแบบในสิ่งที่ดูเหมือนจะเป็นสถานที่ที่คุณตั้งไว้ ใช้สัญลักษณ์เป็นคำนำหน้า
kungphu

@kungphu คุณหมายถึงอะไร ดูbabel.pocoo.org/en/latest/api/…
Julian

1
@Julian ดูเหมือนว่าlocaleอาร์กิวเมนต์จะformat_currencyถูกใช้เพื่อแก้ไขปัญหานี้ แต่ไม่ได้อยู่ในเอกสารเมื่อสี่ปีก่อน (เมื่อฉันเขียนความคิดเห็นนั้น) หรือฉันเพิ่งทดสอบรหัสคำตอบนี้โดยไม่ตรวจสอบเอกสาร
kungphu

1
@kungphu Gotcha ฉันต้องไม่ใส่ใจอายุของโพสต์นี้เมื่อวานนี้ ดูเหมือนว่าการเปลี่ยนแปลงเอกสาร / ฟังก์ชั่นมีแนวโน้มมาก ไชโย!
Julian

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-strings มันดูสวยงามยิ่งกว่า:print(f'Value is: ${value:,.2f}'.replace('$-', '-$'))
Timo Saloranta

16

การตั้งค่าภาษาของฉันดูเหมือนไม่สมบูรณ์ดังนั้นฉันจึงดูเกินคำตอบ SO และพบ:

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

ระบบปฏิบัติการที่เป็นอิสระ

แค่อยากจะแบ่งปันที่นี่


แต่เราจะเรียกว่า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') ทำเพื่อฉัน
alexblum

9

"{:0,.2f}".format(float(your_numeric_value))ใน Python 3 ทำงานได้ มันให้บางสิ่งบางอย่างเช่นหนึ่งในบรรทัดต่อไปนี้:

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

6

ถ้าฉันเป็นคุณฉันจะใช้ BABEL: http://babel.pocoo.org/en/latest/index.html

from babel.numbers import format_decimal


format_decimal(188518982.18, locale='en_US')

1
โมดูลภาษาหลามไม่ทำงานสำหรับฉัน (ภาษาใดก็ตามที่ฉันตั้งไว้มันบ่น) แต่ต้องการ Babel และการใช้ฟังก์ชั่นนี้ดี มันคุ้มค่าที่มีลักษณะในเอกสารของ API เป็นมีพารามิเตอร์มากขึ้นและฟังก์ชั่นที่มีประโยชน์มากขึ้น (เช่นสกุลเงิน: format_currency)
แดเนียลดับเบิลยู.

3

โอ้นั่นเป็นสัตว์ร้ายที่น่าสนใจ

ฉันใช้เวลาในการทำให้ถูกต้องมีสามประเด็นหลักที่แตกต่างจากสถานที่เกิดเหตุ: - สัญลักษณ์สกุลเงินและทิศทาง - ตัวคั่นหลักพัน - ตัวคั่นหลักพัน - จุดทศนิยม

ฉันได้เขียนการใช้งานที่กว้างขวางของตัวเองซึ่งเป็นส่วนหนึ่งของกรอบ kiwi python ลองดู LGPL: ed source ที่นี่:

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

รหัสนี้เป็นลินุกซ์ / Glibc เล็กน้อยโดยเฉพาะ แต่ไม่ควรยากเกินไปที่จะนำไปใช้กับ windows หรือ unixes อื่น ๆ

เมื่อคุณติดตั้งแล้วคุณสามารถทำสิ่งต่อไปนี้:

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

ซึ่งจะให้คุณ:

'$10.50'

หรือ

'10,50 kr'

ขึ้นอยู่กับสถานที่ที่เลือกในปัจจุบัน

จุดหลักที่โพสต์นี้มีอยู่เหนืออีกโพสต์คือมันจะทำงานร่วมกับหลามรุ่นเก่ากว่า locale.currency ได้รับการแนะนำใน python 2.5


มีข้อได้เปรียบเหนือ locale.currency () หรือไม่
Ali Afshar

@AliAfshar: ข้อดีอย่างหนึ่งที่จะเป็นแทน10,50 kr kr 10,50
user2394284

2

#printing ตัวแปร 'รวม:' ในรูปแบบที่มีลักษณะเช่นนี้ '9,348.237'

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

โดยที่ '{: 7, .3f}' คือจำนวนช่องว่างสำหรับการจัดรูปแบบตัวเลขในกรณีนี้คือล้านด้วยทศนิยม 3 ตำแหน่ง จากนั้นคุณเพิ่ม '.format (zum1) zum1 เป็นตัวแปร tha ที่มีจำนวนมากสำหรับผลรวมของตัวเลขทั้งหมดในโปรแกรมเฉพาะของฉัน ตัวแปรสามารถเป็นอะไรก็ได้ที่คุณตัดสินใจใช้


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'

ประเทศส่วนใหญ่ใช้สัญลักษณ์สกุลเงินตามจำนวนเงินไม่ใช่วิธีอื่น ๆ
Jonas Byström

@jonas บางทีนั่นอาจเป็นสิ่งที่ประเทศส่วนใหญ่ทำ แต่ OP ได้รับมาก่อนจำนวนเงินดังนั้นฉันจึงได้รับมาก่อนจำนวนคำตอบของฉันด้วย :)
mu

0

รหัสหลามง่าย ๆ !

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.