2012-08-22 3 views
26

Bir float'u virgülle ayrılmış para birimi olarak biçimlendirmeye çalışıyorum. Örneğin. 543921.9354, $543,921.94 olur. Ben Python format işlevi yerine Python % operatör taklit görünüyor gibi Jinja şablonları, format filtre kullanıyorum?Jinja Şablonları - Bir float virgülle ayrılmış para birimi olarak biçimlendirin

Jinja'da bu biçimlendirmeyi nasıl yapabilirim? format filtresini kullanarak mümkün mü?

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

tabii verimleri

$543921.94

cevap

39

bunun için bir custom filter yazın: Bu benim virgül dışında her şeyi yapar, hangi bugüne kadar ne olduğunu. Eğer piton 2.7 kullanıyorsanız, bu şöyle olabilir:

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

Python 2.6 veya varsa yeni: Sen daha geniş bir çözüm olarak, tek bir amaç için özel bir filtre yazmak ama olabilir

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 format filtreyi yerini alacak (Jinja 2.7.1 itibariyle):, ayrıca biçim filtresi kendisi güncelleme olabilir. Fonksiyonun çoğunluğu, format kaynağından doğrudan koptu. Bu işlev ile jinja'nın arasındaki tek fark, dizeyi biçimlendirmek için str.format() işlevini kullanmasıdır.

Jinja2'nin (bu yazı yazıldığı sırada) artık Python 2.5'i desteklemediğini görüyorum, bahse girerim, format filtresinin Python'un str.format() kullanıyor olmasından çok uzun sürmeyecektir.

36

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

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

Ben bağımlılıkları bu işi yapmak tam olarak ne olduğundan emin değilim ama IMHO bu cevabı okuyan herkes, en azından özel filtreler hakkında endişelenmeden önce denemek için iyi olurdu.

+1

Bu benim için Python 2.7 üzerinde çalışıyor. Mükemmel cevap! – hamx0r

+0

Yuvarlak parçanın nasıl gizleneceği ve sadece ondalık göstergelerin nasıl görüntüleneceği hakkında bir fikrin var mı? –

3

Kesinlikle özel bir filtre yazardı, Vasi yanıtını @alex uzatmak için, ama aynı zamanda para gruplama ve sembol kolları Python kendi locale işlevselliğini,

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

ana şey için kullandığımız locale'u kullanmaya dikkat edin, varsayılan 'C' yerel ayarıyla çalışmadığı için, makinenizde mevcut olan bir şey ayarlamanız gerekir.

aradığınız şey için, muhtemelen ihtiyaç

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

ancak sterlini pound isteseydi, kullanmak istiyorum,

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'