Подтвердить что ты не робот

Шаблоны Jinja - форматирование float как запятая

Я пытаюсь отформатировать float как валюту, разделенную запятыми. Например. 543921.9354 становится $543,921.94. Я использую фильтр format в шаблонах Jinja, который, похоже, имитирует оператор % в Python, а не функцию Python format?

Как я могу выполнить это форматирование в Jinja? Возможно ли использование фильтра format? Это то, что у меня есть до сих пор, что выполняет все, кроме запятых:

"$%.2f"|format(543921.9354)

что, конечно, дает

$543921.94

4b9b3361

Ответ 1

Напишите настраиваемый фильтр. Если вы используете python 2.7, он может выглядеть следующим образом:

def format_currency(value):
    return "${:,.2f}".format(value)

Ответ 2

Обновление. Используя Jinja2 и Python 3, это неплохо работало в шаблоне без необходимости определять какой-либо пользовательский код:

{{ "${:,.2f}".format(543921.9354) }}

Я не уверен, какие именно зависимости должны иметь эту работу, но IMHO, кто-либо еще читающий этот ответ, подойдет, по крайней мере, попробовать, прежде чем беспокоиться о настраиваемых фильтрах.

Ответ 3

Чтобы расширить ответ @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'

Ответ 4

Python3.6:

def numberFormat(value):
    return format(int(value), ',d')

Колба глобальный фильтр

@app.template_filter()
def numberFormat(value):
    return format(int(value), ',d')

Глобальный фильтр Flask для Blueprint

@app.app_template_filter()
def numberFormat(value):
    return format(int(value), ',d')

Назовите этот глобальный фильтр

{{ '1234567' | numberFormat }}
#prints 1,234,567

Вызов его в Jinja без назначения глобального фильтра

{{ format('1234567', ',d') }}
#prints 1,234,567

Ответ 5

Если у вас есть 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().

Ответ 6

Пользовательский фильтр с использованием 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