파이썬의 통화 형식


156

Python을 사용하여 188518982.18에서 £ 188,518,982.18과 같은 숫자를 형식화하려고합니다.

어떻게해야합니까?


@RailsSon 아래의 주석에서 훌륭한 지적을했습니다. 특정 통화를 표시하기 위해 £를 인쇄하고 싶지만 재무 표시에 일본어 식을 사용하여 해당 표시를 사용하십시오. locale모듈의 통화 값 사용과 통화 표시 속성 을 분리하여 요청이 언어로 구현되지 않은 것이 이상합니다 .
Droogans 2012 년

답변:


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
모국어가 아닌 통화를 올바르게 포맷하려면 어떻게해야합니까? 일본어 보고서의 비용을 GB 파운드로 표시한다고 가정합니까?
SingleNegationElimination

2
@TokenMacGuy : 그것은 속임수입니다. 일본어 보고서는 일본어 쉼표와 소수 자릿수 규칙을 의미하지만 GB 파운드 통화 기호는 로케일에서 사소하게 지원되지 않습니다. 사용자 정의 로케일 정의를 작성해야합니다.
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
@mrooney 또한 전체 모듈을 가져 오지 않는 것과 같이 허용 된 로캘 답변을 사용하지 않는 데는 여러 가지 이유가 있습니다.
Josh

1
@Josh, "로케일 가져 오기 통화에서".
앤드류 H

5
@mrooney : '$ {: 0, .2f}'. format (184467616.1) 만하면됩니다. 이제 기호
triunenature가 있습니다.

$ 123,456.78때때로 발생하는 @triunenature . 편집 : 인하는 더 $와 숫자 사이에있다 척, 여분의 공간을 소요
CyberJacob

48

왜 온라인에서 (또는이 스레드에서) 더 언급되지 않았는지 확실하지 않지만 Edgewall 직원 의 Babel 패키지 (및 Django 유틸리티)는 통화 형식 (및 기타 많은 i18n 작업)에 적합합니다. 그것은 핵심 파이썬 로케일 모듈과 같은 모든 것을 세계적으로 할 필요가 없기 때문에 좋습니다.

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_currency4 년 전 문서에 없었거나 (댓글을 작성한 시점) 문서를 확인하지 않고 그대로이 답변의 코드를 테스트했습니다.
kungphu

1
@kungphu 잡았다. 나는 어제이 포스트의 나이에주의를 기울이지 않았어야했다. 설명서 / 기능 변경 가능성이 매우 높습니다. 건배!
율리우스

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- 문자열을 사용하면 훨씬 더 아름답게 보입니다.print(f'Value is: ${value:,.2f}'.replace('$-', '-$'))
Timo Saloranta


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))파이썬 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있습니다.
Daniel W.

3

오, 그거 흥미로운 짐승이야.

나는 그 권리를 얻는 데 상당한 시간을 보냈습니다 .- 로케일마다 다른 세 가지 주요 문제가 있습니다 :-통화 기호 및 방향-천 단위 구분 기호-소수점

나는 키위 파이썬 프레임 워크의 일부인 이것에 대한 다소 광범위한 구현을 작성했습니다. 여기에서 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에서 도입되었습니다.


locale.currency ()보다 장점이 있습니까?
Ali Afshar

@AliAfshar : 10,50 kr대신 한 가지 장점이 있습니다 kr 10,50.
user2394284

2

# 'Total :'변수를 '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". 문자열을 왜곡합니다.
유진 Gr. Philippov

예, 몰랐습니다. 당신도 대답했습니다.
Vanjith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.