Ответ 1
Напишите настраиваемый фильтр. Если вы используете python 2.7, он может выглядеть следующим образом:
def format_currency(value):
return "${:,.2f}".format(value)
Я пытаюсь отформатировать float как валюту, разделенную запятыми. Например. 543921.9354
становится $543,921.94
. Я использую фильтр format
в шаблонах Jinja, который, похоже, имитирует оператор %
в Python, а не функцию Python format
?
Как я могу выполнить это форматирование в Jinja? Возможно ли использование фильтра format
? Это то, что у меня есть до сих пор, что выполняет все, кроме запятых:
"$%.2f"|format(543921.9354)
что, конечно, дает
$543921.94
Напишите настраиваемый фильтр. Если вы используете python 2.7, он может выглядеть следующим образом:
def format_currency(value):
return "${:,.2f}".format(value)
Обновление. Используя Jinja2 и Python 3, это неплохо работало в шаблоне без необходимости определять какой-либо пользовательский код:
{{ "${:,.2f}".format(543921.9354) }}
Я не уверен, какие именно зависимости должны иметь эту работу, но IMHO, кто-либо еще читающий этот ответ, подойдет, по крайней мере, попробовать, прежде чем беспокоиться о настраиваемых фильтрах.
Чтобы расширить ответ @alex vasi, я бы определенно написал собственный фильтр, но я бы также использовал собственную функцию locale
, написанную на python, которая обрабатывает группирование валют, и символ.
def format_currency(value):
return locale.currency(value, symbol=True, grouping=True)
Главное, на что нужно обратить внимание при использовании locale
, это то, что он не работает со стандартным языком "C", поэтому вам нужно установить его так, чтобы он был доступен на вашем компьютере.
Для того, что вы ищете, вам, вероятно, нужно,
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
но если бы вы хотели фунты стерлингов, вы бы использовали,
locale.setlocale(locale.LC_ALL, 'en_GB.UTF_8')
.
import locale
locale.setlocale(locale.LC_ALL, 'en_US')
locale.currency(543921.94, symbol=True, grouping=True)
> '$543,921.94'
locale.setlocale(locale.LC_ALL, 'en_GB')
> '£543,921.94'
def numberFormat(value):
return format(int(value), ',d')
@app.template_filter()
def numberFormat(value):
return format(int(value), ',d')
@app.app_template_filter()
def numberFormat(value):
return format(int(value), ',d')
{{ '1234567' | numberFormat }}
#prints 1,234,567
{{ format('1234567', ',d') }}
#prints 1,234,567
Если у вас есть Python 2.6 или новее:
Вы можете написать собственный фильтр для одной цели, но в качестве более широкого решения вы также можете обновить фильтр формата:
from jinja import Environment, FileSystemLoader
def format(fmt_str, *args, **kwargs):
if args and kwargs:
raise jinja2.exceptions.FilterArgumentError(
"can't handle positional and keyword "
"arguments at the same time"
)
ufmt_str = jinja2.utils.soft_unicode(fmt_str)
if kwargs:
return ufmt_str.format(**kwargs)
return ufmt_str.format(*args)
env = Environment(loader=FileSystemLoader('./my/template/dir'))
env.filters.update({
'format': format,
})
Это заменит существующий фильтр format
(как на Jinja 2.7.1). Большая часть функции была разорвана прямо из источника format
. Единственная разница между этой функцией и jinja заключается в том, что она использует функцию str.format()
для форматирования строки.
Увидев, что Jinja2 (на момент написания этой статьи) больше не поддерживает Python 2.5, я уверен, что недолго, пока фильтр format
не использует Python str.format()
.
Пользовательский фильтр с использованием Babel (может использоваться и для форматирования других валют)
Установите Babel (http://babel.pocoo.org/en/latest/api/numbers.html)
pip install Babel
Пользовательский фильтр Jinja
from babel.numbers import format_currency
@app.template_filter()
def usdollar(value):
return format_currency(value, 'USD', locale='en_US')
app.jinja_env.filters['usdollar'] = usdollar
Использование в шаблоне Jinja:
{{ '-10000.500' | usdollar }}
Output : -$10,000.50