Форматирование валюты в Python - PullRequest
131 голосов
/ 26 ноября 2008

Я хочу отформатировать число от 188518982,18 до 188 518 982,18 фунтов стерлингов, используя Python.

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

Ответы [ 12 ]

177 голосов
/ 26 ноября 2008

См. locale module.

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

>>> 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'
86 голосов
/ 03 августа 2010

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

39 голосов
/ 13 января 2012

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

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

>>> import babel.numbers
>>> import decimal
>>> babel.numbers.format_currency( decimal.Decimal( "188518982.18" ), "GBP" )
£188,518,982.18
21 голосов
/ 13 марта 2017

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

  • Не требует внешних модулей
  • Не требует создания новой функции
  • Может быть сделано в линию
  • Обрабатывает несколько переменных
  • Обрабатывает отрицательные суммы в долларах

Код:

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

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

16 голосов
/ 04 июля 2009

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

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

ОС-независимый

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

9 голосов
/ 05 октября 2010

Если вы используете 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')
3 голосов
/ 26 ноября 2008

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

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

Я написал свою довольно обширную реализацию этого, которая является частью платформы Python kiwi, посмотрите источник 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()

Что даст вам:

'$10.50'

или

'10,50 kr'

В зависимости от выбранной локали.

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

2 голосов
/ 23 февраля 2018

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

from babel.numbers import format_decimal


format_decimal(188518982.18, locale='en_US')
1 голос
/ 21 ноября 2016

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

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

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

0 голосов
/ 08 апреля 2019

Простой код 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)
...