ฉันต้องการจัดรูปแบบตัวเลขเช่น 188518982.18 ถึง£ 188,518,982.18 โดยใช้ Python
ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันต้องการจัดรูปแบบตัวเลขเช่น 188518982.18 ถึง£ 188,518,982.18 โดยใช้ Python
ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
ดูโมดูลสถานที่
การจัดรูปแบบสกุลเงิน (และวันที่) นี้
>>> 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
บางครั้งแม้ว่า แก้ไข: markdown ใช้ช่องว่างเพิ่มเติมหลอกว่ามีมากขึ้นระหว่าง $ และตัวเลข
ไม่แน่ใจว่าทำไมไม่พูดถึงออนไลน์เพิ่มเติม (หรือในหัวข้อนี้) แต่แพ็คเกจ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
locale
อาร์กิวเมนต์จะformat_currency
ถูกใช้เพื่อแก้ไขปัญหานี้ แต่ไม่ได้อยู่ในเอกสารเมื่อสี่ปีก่อน (เมื่อฉันเขียนความคิดเห็นนั้น) หรือฉันเพิ่งทดสอบรหัสคำตอบนี้โดยไม่ตรวจสอบเอกสาร
นี่เป็นบทความโบราณ แต่ฉันเพิ่งใช้วิธีแก้ปัญหาต่อไปนี้ซึ่ง:
รหัส:
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
ระบบปฏิบัติการที่เป็นอิสระ
แค่อยากจะแบ่งปันที่นี่
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
)
โอ้นั่นเป็นสัตว์ร้ายที่น่าสนใจ
ฉันใช้เวลาในการทำให้ถูกต้องมีสามประเด็นหลักที่แตกต่างจากสถานที่เกิดเหตุ: - สัญลักษณ์สกุลเงินและทิศทาง - ตัวคั่นหลักพัน - ตัวคั่นหลักพัน - จุดทศนิยม
ฉันได้เขียนการใช้งานที่กว้างขวางของตัวเองซึ่งเป็นส่วนหนึ่งของกรอบ 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
10,50 kr
kr 10,50
#printing ตัวแปร 'รวม:' ในรูปแบบที่มีลักษณะเช่นนี้ '9,348.237'
print ('Total:', '{:7,.3f}'.format(zum1))
โดยที่ '{: 7, .3f}' คือจำนวนช่องว่างสำหรับการจัดรูปแบบตัวเลขในกรณีนี้คือล้านด้วยทศนิยม 3 ตำแหน่ง จากนั้นคุณเพิ่ม '.format (zum1) zum1 เป็นตัวแปร tha ที่มีจำนวนมากสำหรับผลรวมของตัวเลขทั้งหมดในโปรแกรมเฉพาะของฉัน ตัวแปรสามารถเป็นอะไรก็ได้ที่คุณตัดสินใจใช้
แรงบันดาลใจจากรหัสข้างต้น: 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
ฉันมาดูในสิ่งเดียวกันและพบว่าหลามเงินไม่ได้ใช้จริง ๆ แต่อาจจะมีทั้งสองอย่างผสมกัน
แลมบ์ดาสำหรับการคำนวณภายในฟังก์ชันด้วยความช่วยเหลือจากคำตอบของ @ 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'
รหัสหลามง่าย ๆ !
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
ใช้ค่าสกุลเงินของโมดูลและคุณสมบัติการแสดงผลของสกุลเงินนั้น