답변:
로케일 모듈을 참조하십시오 .
통화 및 날짜 형식을 지정합니다.
>>> 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
때때로 발생하는 @triunenature . 편집 : 인하는 더 $와 숫자 사이에있다 척, 여분의 공간을 소요
왜 온라인에서 (또는이 스레드에서) 더 언급되지 않았는지 확실하지 않지만 Edgewall 직원 의 Babel 패키지 (및 Django 유틸리티)는 통화 형식 (및 기타 많은 i18n 작업)에 적합합니다. 그것은 핵심 파이썬 로케일 모듈과 같은 모든 것을 세계적으로 할 필요가 없기 때문에 좋습니다.
OP가 제공 한 예는 다음과 같습니다.
>>> import babel.numbers
>>> import decimal
>>> babel.numbers.format_currency( decimal.Decimal( "188518982.18" ), "GBP" )
£188,518,982.18
locale
논쟁 처럼 보이지만 format_currency
4 년 전 문서에 없었거나 (댓글을 작성한 시점) 문서를 확인하지 않고 그대로이 답변의 코드를 테스트했습니다.
이것은 고대 게시물이지만 방금 다음과 같은 솔루션을 구현했습니다.
암호:
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
OS 독립적
여기서 공유하고 싶었습니다.
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))
파이썬 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
있습니다.
오, 그거 흥미로운 짐승이야.
나는 그 권리를 얻는 데 상당한 시간을 보냈습니다 .- 로케일마다 다른 세 가지 주요 문제가 있습니다 :-통화 기호 및 방향-천 단위 구분 기호-소수점
나는 키위 파이썬 프레임 워크의 일부인 이것에 대한 다소 광범위한 구현을 작성했습니다. 여기에서 LGPL : 소스를 확인하십시오.
http://svn.async.com.br/cgi-bin/viewvc.cgi/kiwi/trunk/kiwi/currency.py?view=markup
코드는 약간 Linux / Glibc에 따라 다르지만, 윈도우 나 다른 유닉스에 적용하기에는 너무 어렵지 않아야합니다.
설치가 완료되면 다음을 수행 할 수 있습니다.
>>> from kiwi.datatypes import currency
>>> v = currency('10.5').format()
그러면 당신에게 줄 것입니다 :
'$10.50'
또는
'10,50 kr'
현재 선택된 로케일에 따라 다릅니다.
이 게시물이 다른 게시물보다 중요한 점은 이전 버전의 Python에서 작동한다는 것입니다. locale.currency는 Python 2.5에서 도입되었습니다.
10,50 kr
대신 한 가지 장점이 있습니다 kr 10,50
.
위의 코드에서 영감을 얻었습니다 .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
모듈의 통화 값 사용과 통화 표시 속성 을 분리하여 요청이 언어로 구현되지 않은 것이 이상합니다 .