Soru Jinja Şablonları - Bir yüzdeyi virgülle ayrılmış para birimi olarak biçimlendir


Float'ı virgülle ayrılmış para birimi olarak biçimlendirmeye çalışıyorum. Örneğin. 543921.9354 olur $543,921.94. Kullanıyorum format Jinja şablonları filtrelemek % Python yerine Python'da operatör format işlev?

Jinja'da bu formatlamayı nasıl yapabilirim? Kullanarak mümkün mü format filtre? Şimdiye kadar sahip olduğum şey bu, virgüller hariç her şeyi başarır:

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

tabii ki sonuç

$543921.94


30
2017-08-22 17:41


Menşei




Cevaplar:


Yaz özel filtre bunun için. Eğer python 2.7 kullanıyorsanız, şöyle görünebilir:

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

42
2017-08-22 20:07





Güncelleme: Jinja2 ve Python 3 kullanarak, bu herhangi bir özel kod tanımlamak zorunda kalmadan şablonda oldukça güzel çalıştı:

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

Bağımlılıkların bu işe sahip olması için tam olarak emin değilim, fakat IMHO bu cevabı okuyan herkes, en azından özel filtreler için endişelenmeden önce bunu denemek için iyi olurdu.


45
2017-07-01 10:29



Bu benim için Python 2.7'de çalışıyor. Mükemmel cevap! - hamx0r
Yuvarlak parçanın nasıl gizleneceği ve sadece ondalık gösterimlerin nasıl görüntüleneceği hakkında bir fikrin var mı? - Alexandru Rada


@Alex vasi'nin cevabını uzatmak için, kesinlikle bir özel filtre yazardım, ama aynı zamanda python'un kendi locale para birimi gruplamasını işleyen işlevsellik ve sembol,

def format_currency(value):
    locale.currency(value, symbol=True, grouping=True)

Kullanmayı not almanın en önemli yanı locale varsayılan 'C' yerel ayarıyla çalışmadığı için makinenizde mevcut olan bir şey ayarlamanız gerekir.

Aradığın şey için muhtemelen ihtiyacın var.

locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')

ama sterlin sterlin istediysen,

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
2018-01-28 17:53





Python 2.6 veya daha yeni bir sürümünüz varsa:

Tek bir amaç için özel bir filtre yazabilirsiniz, ancak daha geniş bir çözüm olarak, biçim filtresinin kendisini de güncelleyebilirsiniz:

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,
})

Bu mevcut yerini alacak format filtre (Jinja 2.7.1'den itibaren). Fonksiyonun büyük kısmı doğrudan format kaynak. Bu fonksiyon ile jinja'nın arasındaki tek fark, str.format() dizeyi biçimlendirmek için işlev.

Jinja2'nin (bu yazı yazıldığı sırada) Python 2.5'i artık desteklemediğine inanıyorum. format filtre Python kullanıyor str.format().


3
2017-09-25 14:20





Python3.6:

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

Şişe küresel filtre

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

Blueprint için küresel şişe filtresi

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

Bu küresel filtreyi ara

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

Küresel bir filtre atamadan Jinja'da arama

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

0
2018-04-28 09:44