Định dạng tiền tệ trong Python


156

Tôi đang tìm cách định dạng một số như 188518982,18 đến £ 188,518,982,18 bằng Python.

Tôi có thể làm cái này như thế nào?


Bạn đã đưa ra một điểm tuyệt vời trong một nhận xét bên dưới, @RailsSon: bạn muốn in £ s để hiển thị một loại tiền cụ thể, nhưng sử dụng màn hình đó bằng cách sử dụng biểu thức tiếng Nhật cho số tài chính. Tôi thấy lạ là yêu cầu của bạn chưa được thực hiện bằng ngôn ngữ bằng cách tách riêng việc localesử dụng giá trị tiền tệ của mô-đun và thuộc tính hiển thị của loại tiền đó.
Dropogans

Câu trả lời:


212

Xem mô đun miền địa phương .

Điều này không định dạng tiền tệ (và ngày).

>>> 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
Làm cách nào để định dạng chính xác một loại tiền không phải là tiền bản địa, Giả sử tôi đang hiển thị chi phí tính bằng GB cho báo cáo tiếng Nhật?
SingleNegationElimination

2
@TokenMacGuy: Đó là một câu hỏi mẹo. Báo cáo tiếng Nhật có nghĩa là quy tắc dấu phẩy và vị trí thập phân của Nhật Bản nhưng ký hiệu tiền tệ GB Pound - không được Locale hỗ trợ một cách tầm thường. Bạn phải tạo một định nghĩa miền địa phương tùy chỉnh.
S.Lott

nếu số người tặng là âm trả về giá trị giữa "()" tại sao?
panchicore

6
Điều này vẫn không làm việc cho tôi, nhưng tôi đã thay đổi nó locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')và nó hoạt động hoàn hảo!
Furbeenator

2
@panchicore ký hiệu cho các số âm được biểu thị bằng dấu ngoặc đơn là một thông lệ phổ biến trong thế giới kế toán. Hãy thử nó trong oocalc hoặc excel và định dạng các số cho loại kế toán.
Dropogans

94

Mới trong 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
Điều đó gọn gàng nhưng không thực sự trả lời câu hỏi, vì giải pháp được yêu cầu sẽ bao gồm ký hiệu tiền tệ và bạn cũng khó mã hóa số chữ số sau số thập phân, cụ thể theo miền địa phương. Có nhiều lý do hơn để sử dụng câu trả lời địa phương được chấp nhận nếu bạn không chỉ muốn đặt dấu phẩy.
mrooney

6
@mrooney Cũng có nhiều lý do để không sử dụng câu trả lời ngôn ngữ được chấp nhận, chẳng hạn như không nhập toàn bộ mô-đun.
Josh

1
@Josh, "từ tiền tệ nhập khẩu địa phương".
Andrew H

5
@mrooney: Bạn chỉ có thể thực hiện: '$ {: 0, .2f}'. Định dạng (184467616.1) và bây giờ bạn có biểu tượng
triunenature

@triunenature $ 123,456.78đôi khi sẽ dẫn đến . Chỉnh sửa: markdown lấy ra khoảng trắng thừa, giả vờ có nhiều hơn giữa $ và các số
CyberJacob

48

Không hoàn toàn chắc chắn tại sao nó không được đề cập trực tuyến nhiều hơn (hoặc trên chuỗi này), nhưng gói Babel (và các tiện ích Django) từ những người Edgewall là tuyệt vời cho định dạng tiền tệ (và rất nhiều nhiệm vụ i18n khác). Thật tuyệt vì nó không phải chịu sự cần thiết phải làm mọi thứ trên toàn cầu như mô đun miền địa phương Python cốt lõi.

Ví dụ mà OP đưa ra sẽ đơn giản là:

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

2
Lưu ý rất muộn: Thử nghiệm điều này, nó dường như không định dạng tiền tệ một cách thông minh, vì nó chỉ đơn giản là gắn biểu tượng thích hợp trước số tiền (được định dạng theo địa điểm bạn đã đặt, hợp lý), bất kể tiền tệ đó có thực sự không sử dụng biểu tượng của nó làm tiền tố.
kungphu

@kungphu Ý bạn là gì? Xem babel.pocoo.org/en/latest/api/ Kẻ
Julian

1
@Julian Có vẻ như localeđối số format_currencycó thể được sử dụng để giải quyết vấn đề này, nhưng đó không phải là tài liệu bốn năm trước (khi tôi viết nhận xét đó) hoặc tôi chỉ kiểm tra mã của câu trả lời này mà không cần kiểm tra tài liệu.
kungphu

1
@kungphu Gotcha. Tôi đã không chú ý đến tuổi của bài đăng này ngày hôm qua. Các tài liệu / chức năng thay đổi dường như rất có thể. Chúc mừng!
Julian

32

Đây là một bài viết cổ, nhưng tôi chỉ thực hiện các giải pháp sau đây:

  • Không yêu cầu mô-đun bên ngoài
  • Không yêu cầu tạo chức năng mới
  • Có thể được thực hiện trong dòng
  • Xử lý nhiều biến
  • Xử lý số tiền đô la âm

Mã số:

num1 = 4153.53
num2 = -23159.398598

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

Đầu ra:

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

Và đối với những poster ban đầu, rõ ràng, chỉ cần chuyển $cho£


định dạng của tôi cần một số tùy chỉnh, nhưng không sao vì tôi có thể làm điều đó với giải pháp này.
DonkeyKong

9
Ý tưởng tuyệt vời! Với Python 3.6 và chuỗi f, nó trông còn đẹp hơn nữa:print(f'Value is: ${value:,.2f}'.replace('$-', '-$'))
Timo Saloranta


9

Nếu bạn đang sử dụng OSX và chưa đặt mô-đun địa phương, câu trả lời đầu tiên này sẽ không hoạt động, bạn sẽ nhận được lỗi sau:

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.

Để khắc phục điều này, bạn sẽ phải sử dụng như sau:

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

2
locale.setlocale (locale.LC_ALL, 'en_US.UTF-8') dành cho tôi
alexblum

9

"{:0,.2f}".format(float(your_numeric_value))trong Python 3 thực hiện công việc; nó đưa ra một cái gì đó giống như một trong những dòng sau:

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

6

Nếu tôi là bạn, tôi sẽ sử dụng BABEL: http://babel.pocoo.org/en/latest/index.html

from babel.numbers import format_decimal


format_decimal(188518982.18, locale='en_US')

1
Mô-đun miền địa phương python không hoạt động với tôi (bất cứ ngôn ngữ nào tôi đặt nó, nó đều phàn nàn) nhưng yêu cầu babel và sử dụng chức năng này là tốt. Thật đáng để xem qua các tài liệu API vì có nhiều tham số và các hàm hữu ích hơn (như đối với tiền tệ format_currency:).
Daniel W.

3

Ồ, đó là một con thú thú vị.

Tôi đã dành thời gian đáng kể để có được quyền đó, có ba vấn đề chính khác nhau từ địa phương đến địa phương: - biểu tượng và hướng tiền tệ - dấu phân cách nghìn - dấu thập phân

Tôi đã viết bản triển khai khá rộng rãi của riêng tôi về phần này là một phần của khung trăn kiwi, hãy xem nguồn LGPL: ed tại đây:

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

Mã này hơi dành riêng cho Linux / Glibc, nhưng không quá khó để áp dụng cho các cửa sổ hoặc các bản phối khác.

Khi bạn đã cài đặt xong, bạn có thể làm như sau:

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

Mà sau đó sẽ cung cấp cho bạn:

'$10.50'

hoặc là

'10,50 kr'

Tùy thuộc vào miền địa phương hiện được chọn.

Điểm chính của bài đăng này là trên bài khác là nó sẽ hoạt động với các phiên bản cũ hơn của python. locale.currency đã được giới thiệu trong python 2.5.


Liệu nó có lợi thế hơn locale.currency ()?
Ali Afshar

@AliAfshar: Một lợi thế sẽ là 10,50 krthay vì kr 10,50.
user2394284

2

#printing biến 'Total:' ở định dạng giống như '9,348.237'

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

trong đó '{: 7, .3f}' es số lượng khoảng trắng để định dạng số trong trường hợp này là một triệu với 3 điểm thập phân. Sau đó, bạn thêm '.format (zum1). Biến zum1 là biến có số lớn cho tổng của tất cả số trong chương trình cụ thể của tôi. Biến có thể là bất cứ điều gì mà bạn quyết định sử dụng.


1

Lấy cảm hứng từ đoạn mã trên: 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

Tôi đã đến để xem xét điều tương tự và thấy tiền python chưa thực sự sử dụng nó nhưng có lẽ sự kết hợp của cả hai sẽ tốt


0

Một lambda để tính toán nó bên trong một hàm, với sự giúp đỡ từ câu trả lời của @ Nate

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

và sau đó,

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

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

Hầu hết các quốc gia sử dụng ký hiệu tiền tệ sau số tiền, không phải cách khác.
Jonas Byström

@jonas Có thể đó là những gì hầu hết các quốc gia làm, nhưng OP đã có nó trước số tiền, do đó tôi cũng đã nhận được trước số tiền trong câu trả lời của mình :)
mu 無

0

Mã trăn đơn giản!

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
Lợi nhuận mã của bạn chuỗi thích "$2,129.1468284147656", "$10,948.3742933", "$1,0908". Rắc chuỗi.
Eugene Gr. Philippov

Có tôi đã không thông báo. Bạn đã cho ans quá.
Vanjith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.