Respostas:
Veja o módulo de localidade .
Isso faz a formatação de moeda (e data).
>>> 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')
e funcionou perfeitamente!
>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'
$ 123,456.78
algumas vezes. Edit: markdown retira os espaços extras, finja que há mais entre $ e números #
Não sei ao certo por que não foi mencionado mais online (ou neste tópico), mas o pacote Babel (e os utilitários Django) do pessoal do Edgewall é incrível para formatação de moeda (e muitas outras tarefas do i18n). É bom porque não sofre com a necessidade de fazer tudo globalmente, como o módulo principal de localidade do Python.
O exemplo que o OP deu seria simplesmente:
>>> import babel.numbers
>>> import decimal
>>> babel.numbers.format_currency( decimal.Decimal( "188518982.18" ), "GBP" )
£188,518,982.18
locale
argumento format_currency
pode ser usado para resolver isso, mas isso não estava no documento há quatro anos (quando escrevi esse comentário) ou apenas testei o código dessa resposta como está sem verificar o documento.
Este é um post antigo, mas acabei de implementar a seguinte solução, que:
Código:
num1 = 4153.53
num2 = -23159.398598
print 'This: ${:0,.0f} and this: ${:0,.2f}'.format(num1, num2).replace('$-','-$')
Resultado:
This: $4,154 and this: -$23,159.40
E para o pôster original, obviamente, basta mudar $
para£
print(f'Value is: ${value:,.2f}'.replace('$-', '-$'))
Minhas configurações de localidade pareciam incompletas, então eu também procurei além desta resposta do SO e descobri:
http://docs.python.org/library/decimal.html#recipes
Independente do SO
Só queria compartilhar aqui.
def moneyfmt(value, places=2, curr='', sep=',', dp='.', pos='', neg='-', trailneg='')
?
Se você estiver usando o OSX e ainda não tiver definido a configuração do módulo de localidade, esta primeira resposta não funcionará, você receberá o seguinte erro:
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.
Para remediar isso, você precisará usar o seguinte:
locale.setlocale(locale.LC_ALL, 'en_US')
"{:0,.2f}".format(float(your_numeric_value))
no Python 3 faz o trabalho; fornece algo como uma das seguintes linhas:
10,938.29
10,899.00
10,898.99
2,328.99
Se eu fosse você, usaria o BABEL: http://babel.pocoo.org/en/latest/index.html
from babel.numbers import format_decimal
format_decimal(188518982.18, locale='en_US')
format_currency
.
Oh, isso é uma fera interessante.
Passei um tempo considerável para acertar isso, há três problemas principais que diferem de localidade para localidade: - símbolo e direção da moeda - separador de milhar - ponto decimal
Eu escrevi minha própria implementação bastante extensa disso, que faz parte da estrutura do kiwi python, confira a fonte LGPL: ed aqui:
http://svn.async.com.br/cgi-bin/viewvc.cgi/kiwi/trunk/kiwi/currency.py?view=markup
O código é um pouco específico do Linux / Glibc, mas não deve ser muito difícil de adotar no Windows ou em outros unixes.
Depois de instalá-lo, você pode fazer o seguinte:
>>> from kiwi.datatypes import currency
>>> v = currency('10.5').format()
O que lhe dará:
'$10.50'
ou
'10,50 kr'
Dependendo do local selecionado atualmente.
O ponto principal deste post sobre o outro é que ele funcionará com versões mais antigas do python. locale.currency foi introduzido no python 2.5.
10,50 kr
vez de kr 10,50
.
#imprimir a variável 'Total:' em um formato semelhante a '9.348.237'
print ('Total:', '{:7,.3f}'.format(zum1))
onde '{: 7, .3f}' é o número de espaços para formatar o número nesse caso, é um milhão com 3 casas decimais. Em seguida, você adiciona o '.format (zum1). O zum1 é a variável que possui o grande número para a soma de todos os números no meu programa em particular. Variável pode ser qualquer coisa que você decida usar.
Inspirado no código acima: 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
Eu vim para olhar a mesma coisa e descobri que o python-money ainda não o utilizava, mas talvez uma mistura dos dois seria boa
Um lambda para calcular dentro de uma função, com a ajuda da resposta de @ Nate
converter = lambda amount, currency: "%s%s%s" %(
"-" if amount < 0 else "",
currency,
('{:%d,.2f}'%(len(str(amount))+3)).format(abs(amount)).lstrip())
e depois,
>>> converter(123132132.13, "$")
'$123,132,132.13'
>>> converter(-123132132.13, "$")
'-$123,132,132.13'
Código python simples!
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"
. Garbles a corda.
locale
uso do valor da moeda do módulo e as propriedades de exibição dessa moeda.