Ответы:
Смотрите модуль локали .
Это делает форматирование валюты (и даты).
>>> 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')
и это работало отлично!
>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'
$ 123,456.78
иногда приводит к тому, что. Изменить: уценка убирает лишние пробелы, притвориться, что есть больше между $ и числами
Не совсем понятно, почему он не упоминается более онлайн (или в этой ветке), но пакет Babel (и утилиты Django) от ребят из Edgewall хорош для форматирования валюты (и множества других задач i18n). Это приятно, потому что он не страдает от необходимости делать все глобально, как основной языковой модуль Python.
Пример, приведенный OP, будет просто:
>>> import babel.numbers
>>> import decimal
>>> babel.numbers.format_currency( decimal.Decimal( "188518982.18" ), "GBP" )
£188,518,982.18
locale
аргумент, который format_currency
можно использовать для решения этой проблемы, но либо этого не было в документе четыре года назад (когда я писал этот комментарий), либо я просто протестировал код этого ответа как есть, не проверяя документ.
Это древний пост, но я только что реализовал следующее решение, которое:
Код:
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
И для оригинального плаката, очевидно, просто переключитесь $
на£
print(f'Value is: ${value:,.2f}'.replace('$-', '-$'))
Мои настройки локали казались неполными, поэтому я слишком посмотрел за пределы этого ответа SO и обнаружил:
http://docs.python.org/library/decimal.html#recipes
ОС-независимый
Просто хотел поделиться здесь.
def moneyfmt(value, places=2, curr='', sep=',', dp='.', pos='', neg='-', trailneg='')
?
Если вы используете 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')
"{:0,.2f}".format(float(your_numeric_value))
в Python 3 делает свою работу; он выдает что-то вроде одной из следующих строк:
10,938.29
10,899.00
10,898.99
2,328.99
На вашем месте я бы использовал BABEL: http://babel.pocoo.org/en/latest/index.html
from babel.numbers import format_decimal
format_decimal(188518982.18, locale='en_US')
format_currency
.
О, это интересный зверь.
Я потратил много времени на то, чтобы понять это правильно, есть три основных вопроса, которые различаются в разных локалях: - символ и направление валюты - разделитель тысяч - десятичная точка
Я написал свою довольно обширную реализацию этого, которая является частью платформы 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.
10,50 kr
вместо kr 10,50
.
# печать переменной 'Total:' в формате, который выглядит следующим образом '9,348.237'
print ('Total:', '{:7,.3f}'.format(zum1))
где '{: 7, .3f}' - количество пробелов для форматирования числа в этом случае - миллион с 3 десятичными точками. Затем вы добавляете '.format (zum1). Zum1 - это переменная, которая имеет большое число для суммы всех чисел в моей конкретной программе. Переменная может быть любой, которую вы решите использовать.
Вдохновленный кодом выше: 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
Я пришел посмотреть на то же самое и обнаружил, что Python-Money еще не использовал его, но, возможно, сочетание двух было бы хорошо
Лямбда для вычисления внутри функции с помощью ответа @ 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'
Простой код на 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)
"$2,129.1468284147656"
, "$10,948.3742933"
, "$1,0908"
. Искажает строку.
locale
модулем значения валюты и свойств отображения этой валюты.