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

Я ищу формат, например, 188518982,18 до £ 188,518,982.18, используя Python.

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

Ответ 1

Смотрите модуль locale.

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

>>> 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'

Ответ 3

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

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

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

Ответ 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

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

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 7

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

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

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

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

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

После установки вы можете сделать следующее:

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

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

'$10.50'

или

'10,50 kr'

В зависимости от выбранного региона.

Главное, что этот пост имеет над другим, заключается в том, что он будет работать со старыми версиями python. locale.currency была введена в python 2.5.

Ответ 8

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

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

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

Ответ 10

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

Ответ 11

Лямбда для вычисления ее внутри функции с помощью @Nate answer

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'

Ответ 12

Простой код на Python!

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)