Форматирование валюты в Python

Я ищу форматировать число, как 188518982.18 до £188,518,982.18 использование Python.

Как я могу это сделать?

11 ответов


посмотреть язык модуль.

это делает форматирование валюты (и даты).

>>> import locale
>>> locale.setlocale( locale.LC_ALL, '' )
'English_United States.1252'
>>> locale.currency( 188518982.18 )
'8518982.18'
>>> locale.currency( 188518982.18, grouping=True )
'8,518,982.18'

новое в 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


не совсем уверен, почему он не упоминается больше в интернете (или в этом потоке), но Бабель пакет (и утилиты Django) от edgewall guys является удивительным для форматирования валюты (и многих других задач i18n). Это приятно, потому что он не страдает от необходимости делать все глобально, как основной модуль языкового стандарта Python.

пример, который дал OP, будет просто:

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

Мои настройки локали казались неполными, поэтому я тоже посмотрел за этот ответ и нашел:

http://docs.python.org/library/decimal.html#recipes

OS-независимый

просто хотел поделиться здесь.


это древний пост, но я только что реализовал следующее решение, которое:

  • не требует внешних модулей
  • не требует создания новой функции
  • можно сделать in-line
  • обрабатывает несколько переменных
  • обрабатывает отрицательные суммы в долларах

код:

num1 = 4153.53
num2 = -23159.398598

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

выход:

This: ,154 and this: -,159.40

и для оригинального плаката, очевидно, просто переключитесь $ для £


Если вы используете 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')

О, это интересный зверь.

Я потратил значительное время, чтобы получить это право, есть три основные проблемы, которые отличаются от локали к локали: - символ валюты и направление - тысячный сепаратор - десятичная точка

Я написал свою собственную довольно обширную реализацию этого, которая является частью Kiwi python framework, проверьте источник LGPL:ed здесь:

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

код немного специфичен для Linux/Glibc, но не должен быть слишком сложным для принятия в windows или других unixes.

после того, как вы установили, что вы можете сделать следующее:

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

который затем даст вам:

'.50'

или

'10,50 kr'

в зависимости от выбранного языка.

В главное, что этот пост имеет над другим, это то, что он будет работать со старыми версиями python. место действия.валюта была введена в Python 2.5.


#печать переменной ' Total: 'в формате, который выглядит так' 9,348.237'

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

где '{:7,.3f} ' es количество пробелов для форматирования числа в этом случае составляет миллион с 3 десятичными точками. Затем вы добавляете ".формат(zum1). Zum1-это переменная, которая имеет большое число для суммы всех чисел в моей конкретной программе. Переменная может быть все, что вы решите использовать.


на вашем месте я бы использовал BABEL:http://babel.pocoo.org/en/latest/index.html

from babel.numbers import format_decimal


format_decimal(188518982.18, locale='en_US')

Я пришел посмотреть на то же самое и нашел python-деньги на самом деле не использовал его, но, возможно, сочетание двух было бы хорошо


лямбда-выражение для вычисления его внутри функции, с помощью @Нейта

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, "$")
'3,132,132.13'

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