2012-08-22 10 views
26

मैं अल्पविराम से अलग मुद्रा के रूप में एक फ्लोट प्रारूपित करने की कोशिश कर रहा हूं। जैसे 543921.9354$543,921.94 बन जाता है। मैं जिन्जा टेम्पलेट्स में format फ़िल्टर का उपयोग कर रहा हूं, जो कि पाइथन format फ़ंक्शन के बजाय पाइथन में % ऑपरेटर की नकल करने लगता है?जिन्जा टेम्पलेट्स - अल्पविराम से अलग मुद्रा के रूप में एक फ्लोट प्रारूपित करें

मैं जिन्जा में इस स्वरूपण को कैसे पूरा कर सकता हूं? क्या यह format फ़िल्टर का उपयोग कर संभव है?

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

निश्चित रूप से जो पैदावार

$543921.94

उत्तर

39

कि के लिए एक custom filter लिखें: यह क्या मैं अब तक जो अल्पविराम के अलावा सब कुछ पूरा करता है, है। आप अजगर 2.7 का उपयोग कर रहे हैं, तो इसे इस तरह देख सकते हैं: आप अजगर 2.6 या है, तो

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

नए:

आप एक ही उद्देश्य के लिए एक कस्टम फिल्टर लिख सकता है, लेकिन एक व्यापक समाधान के रूप में

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 फिल्टर का स्थान ले लेगा (जिंजा 2.7.1 के रूप में):, आप भी प्रारूप फिल्टर स्वयं अपडेट कर सकते हैं। अधिकांश कार्य format स्रोत से सीधे फिसल गया था। इस फ़ंक्शन और जिन्जा के बीच एकमात्र अंतर यह है कि यह स्ट्रिंग को प्रारूपित करने के लिए str.format() फ़ंक्शन का उपयोग करता है।

यह देखते हुए कि Jinja2 (इस लेखन के समय) अब पाइथन 2.5 का समर्थन नहीं करता है, मुझे लगता है कि format फ़िल्टर पाइथन के str.format() का उपयोग करने से पहले नहीं होगा।

36

अद्यतन: Jinja2 और अजगर 3 का उपयोग करना, यह काफी अच्छी तरह से टेम्पलेट के सभी कस्टम कोड को परिभाषित करने के बिना काम किया:

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

मुझे यकीन है कि वास्तव में क्या निर्भरता इस काम के लिए कर रहे हैं नहीं कर रहा हूँ, लेकिन आईएमएचओ इस जवाब को पढ़ने वाले किसी भी व्यक्ति को कस्टम फ़िल्टर के बारे में चिंता करने से पहले कम से कम कोशिश करना अच्छा होगा।

+1

यह मेरे लिए पाइथन 2.7 पर भी काम कर रहा है। बहुत बढ़िया जवाब! – hamx0r

+0

राउंड भाग को छिपाने और केवल दशमलव प्रदर्शित करने के बारे में कोई विचार है? –

3

Vasi के जवाब @alex का विस्तार करने के लिए, मैं निश्चित रूप से कोई कस्टम फ़िल्टर लिखते थे, लेकिन मैं यह भी अजगर की अपनी locale कार्यक्षमता है, जो मुद्रा समूह, और प्रतीक संभालती है,

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

मुख्य बात करने के लिए उपयोग करना चाहते हैं locale का उपयोग करने का ध्यान रखें कि यह डिफ़ॉल्ट 'सी' लोकेल के साथ काम नहीं करता है, इसलिए आपको इसे अपनी मशीन पर उपलब्ध कुछ ऐसा सेट करना होगा।

आप जो खोज रहे हैं के लिए, आप शायद जरूरत है,

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' 
संबंधित मुद्दे