Django टेम्प्लेट में प्रारूप संख्या


153

मैं संख्याओं को प्रारूपित करने का प्रयास कर रहा हूं। उदाहरण:

1     => 1
12    => 12
123   => 123
1234  => 1,234
12345 => 12,345

यह करने के लिए एक बहुत ही आम बात के रूप में हमला करता है, लेकिन मैं यह पता नहीं लगा सकता कि मैं किस फ़िल्टर का उपयोग करने वाला हूं।

संपादित करें: यदि आपके पास ऐसा करने का एक सामान्य पायथन तरीका है, तो मुझे अपने मॉडल में एक स्वरूपित फ़ील्ड जोड़ने में खुशी हो रही है।


3
सावधान रहें यदि आपके लक्षित उपयोगकर्ता यूरोप में भी हैं। जर्मनी जैसे कुछ यूरोपीय देश दशमलव चिह्न के रूप में उपयोग करते हैं।
21

जवाबों:


312

Django का योगदान मानवीयकरण अनुप्रयोग ऐसा करता है:

{% load humanize %}
{{ my_num|intcomma }}

फ़ाइल में 'django.contrib.humanize'अपनी INSTALLED_APPSसूची में जोड़ना सुनिश्चित करें settings.py


17
क्या कोई कारण है कि ये कुछ साधारण फ़िल्टर बिल्ट-इन फ़िल्टर का हिस्सा नहीं हैं?
पावेलरमैन

8
@PawelRoman फिल्टर और टैग का एक गुच्छा लोड करने से बचने के लिए शायद ही कभी इस्तेमाल किया (और इसलिए तेजी से प्रदान टेम्पलेट)
मैक्सिम लोरेंट

मैंने INSTALLED_APPS में 'django.contrib.humanize' जोड़ दिया है और साथ ही अपने टेम्पलेट में {% भार मानवीकृत%} भी शामिल किया है और सर्वर को पुनः आरंभ किया है। हालाँकि, जब मैं "intcomma" फ़िल्टर का उपयोग करने का प्रयास करता हूं, तो मुझे यह त्रुटि मिलती है - अमान्य फ़िल्टर: 'intcomma' यह डीबग ट्रेस 'django.contrib.humanize' दिखाता है जो settings.py में शामिल है। संभावित समस्या क्या हो सकती है?
मनीष

1
यहाँ मेरी अपनी समस्या का उत्तर मिला - मैंने बेस टेम्पलेट में {% लोड मानवकृत%} शामिल किया था (क्योंकि मुझे बहुत सारे टेम्पलेटों की आवश्यकता है)। ऐसा लगता है कि यह काम नहीं करता है - जब मैंने इसे प्रासंगिक टेम्पलेट्स में जोड़ा, तो यह ठीक काम किया! :-)
मनीष

यदि यह काम नहीं करता है, तो यह स्थानीयकरण के कारण हो सकता है। उस स्थिति में {{my_num | intcomma: False}} आज़माएँ
जोस चेरियन

105

अन्य उत्तरों के आधार पर, तैरने के लिए इसे बढ़ाने के लिए, आप यह कर सकते हैं:

{% load humanize %}
{{ floatvalue|floatformat:2|intcomma }}

प्रलेखन: floatformat, intcomma


59

नेड बैचेलेडर के समाधान के बारे में, यहाँ यह 2 दशमलव बिंदुओं और एक डॉलर चिह्न के साथ है। यह कहीं जाता हैmy_app/templatetags/my_filters.py

from django import template
from django.contrib.humanize.templatetags.humanize import intcomma

register = template.Library()

def currency(dollars):
    dollars = round(float(dollars), 2)
    return "$%s%s" % (intcomma(int(dollars)), ("%0.2f" % dollars)[-3:])

register.filter('currency', currency)

तब आप कर सकते हो

{% load my_filters %}
{{my_dollars | currency}}

3
उपरोक्त कोड पर बग, यह कोशिश करें:>>> currency(0.99958) u'$0.00'
अहसन

1
इस कोड को [your_project] / [your_app] / templatetags / [filtername] .py पर अपनी फ़ाइल में जाना चाहिए। इसे तब {% लोड [फ़ाइल नाम]%} के साथ टेम्पलेट में लोड किया जाना चाहिए। अधिक उपयोगी और विशिष्ट जानकारी के लिए docs.djangoproject.com/en/1.10/howto/custom-template-tags देखें ।
मई

20

सेटिंग्स में निम्नलिखित लाइन जोड़ने का प्रयास करें:

USE_THOUSAND_SEPARATOR = True

यह काम करना चाहिए।

प्रलेखन का संदर्भ लें ।


2018-04-16 को अपडेट करें:

इस चीज़ को करने का एक अजगर तरीका भी है:

>>> '{:,}'.format(1000000)
'1,000,000'

10
इसे इस्तेमाल करते समय सावधानी रखें। उरल्स और अन्य में उन स्वरूपों को भी प्रारूपित करेंगे जिन्हें आप टेम्पलेट में जोड़ते हैं
क्रिस्टोफर

4
मैं जोर नहीं दे सकता @Christoffer की टिप्पणी पर्याप्त है - टेम्पलेट्स में जहां आईडी रेंडर किए गए हैं और लिंक में उपयोग किए जाते हैं, यह प्रमुख सिरदर्द पैदा कर सकता है!
लॉन्ड्रोमेट

यह Django टेम्प्लेट
बेन

@ जो उचित नहीं है? सेटिंग्स में "अजगर रास्ता" या हजार विभाजक झंडा? हजार विभाजक ध्वज को Django टेम्प्लेट के लिए अच्छी तरह से काम करना चाहिए। आपका Django का संस्करण क्या है?
गत्ते का डिब्बा। सेविंग

1
स्ट्रिंग प्रारूप (अजगर) तरीका है क्योंकि आप इसे सीधे टेम्पलेट में उपयोग नहीं कर सकते हैं - आपको इसे एक टेम्पलेट टैग में डालना होगा (जो कि एक अच्छा जवाब है), लेकिन इसे बाहर फेंकने से पूर्ण उत्तर के रूप में बहुत कम उपयोग होता है।
बेन

11

यदि आप यहां के स्थानों से जुड़ना नहीं चाहते हैं, तो एक ऐसा कार्य है जो संख्याओं को प्रारूपित करता है:

def int_format(value, decimal_points=3, seperator=u'.'):
    value = str(value)
    if len(value) <= decimal_points:
        return value
    # say here we have value = '12345' and the default params above
    parts = []
    while value:
        parts.append(value[-decimal_points:])
        value = value[:-decimal_points]
    # now we should have parts = ['345', '12']
    parts.reverse()
    # and the return value should be u'12.345'
    return seperator.join(parts)

इस फ़ंक्शन से एक कस्टम टेम्पलेट फ़िल्टर बनाना तुच्छ है।


10

मानवीयकरण अगर आपकी वेबसाइट अंग्रेजी में है समाधान ठीक है। अन्य भाषाओं के लिए, आपको एक और समाधान की आवश्यकता है: मैं बैबल का उपयोग करने की सलाह देता हूं । एक समाधान यह है कि संख्याओं को ठीक से प्रदर्शित करने के लिए एक कस्टम टेम्पलेट टैग बनाया जाए। यहाँ बताया गया है: बस निम्नलिखित फ़ाइल बनाएँ your_project/your_app/templatetags/sexify.py:

# -*- coding: utf-8 -*-
from django import template
from django.utils.translation import to_locale, get_language
from babel.numbers import format_number

register = template.Library()

def sexy_number(context, number, locale = None):
    if locale is None:
        locale = to_locale(get_language())
    return format_number(number, locale = locale)

register.simple_tag(takes_context=True)(sexy_number)

फिर आप इस टेम्प्लेट टैग का उपयोग अपने टेम्प्लेट में इस तरह कर सकते हैं:

{% load sexy_number from sexify %}

{% sexy_number 1234.56 %}
  • एक अमेरिकी उपयोगकर्ता (लोकेल en_US) के लिए यह 1,234.56 प्रदर्शित करता है।
  • एक फ्रेंच उपयोगकर्ता (लोकेल fr_FR) के लिए, यह 1 234,56 प्रदर्शित करता है।
  • ...

इसके बजाय आप चर का उपयोग कर सकते हैं:

{% sexy_number some_variable %}

नोट:context पैरामीटर वर्तमान में मेरे उदाहरण में नहीं किया जाता है, लेकिन मैं इसे वहाँ पता चलता है कि आप आसानी से इसे कुछ भी टेम्पलेट संदर्भ में है कि का उपयोग करने के लिए इस टेम्पलेट टैग ठीक कर सकते हैं डाल दिया।


1
मेरा स्थान 'pt_BR' है और "intcomma" ब्राजील में भी 'से अलग होने' पर काम करता है। ' और नहीं द्वारा ',' जा रहा है floatvalue = 25,000.35 {{floatvalue | intcomma}} में 25000.35 परिणाम
Zokis

आप सही हैं, लेकिन यह प्रारूप हजारों विभाजक (en_US के लिए 25,000.35 और frfFR के लिए 25 000,35) के बारे में उचित नहीं है।
मिनीक्वाक

4

मानवीयकरण एप्लिकेशन ऑफर एक अच्छा और एक नंबर स्वरूपण की एक त्वरित तरीका है, लेकिन आप अल्पविराम से एक विभाजक विभिन्न उपयोग करने की आवश्यकता है, यह के लिए सरल अभी पुन: उपयोग मानवीयकरण app से कोड , विभाजक वर्ण की जगह है, और एक कस्टम फ़िल्टर बनाने । उदाहरण के लिए, एक विभाजक के रूप में स्थान का उपयोग करें :

@register.filter('intspace')
def intspace(value):
    """
    Converts an integer to a string containing spaces every three digits.
    For example, 3000 becomes '3 000' and 45000 becomes '45 000'.
    See django.contrib.humanize app
    """
    orig = force_unicode(value)
    new = re.sub("^(-?\d+)(\d{3})", '\g<1> \g<2>', orig)
    if orig == new:
        return new
    else:
        return intspace(new)

धन्यवाद। मुझे एक डॉट संस्करण की आवश्यकता थी और आपके सुझाव ने मुझे बचा लिया! चीयर्स!
Kstratis

3

विषय से थोड़ा हटकर:

मुझे यह प्रश्न मुद्रा के रूप में एक संख्या को प्रारूपित करने के तरीके की तलाश में मिला, जैसे:

$100
($50)  # negative numbers without '-' and in parens

मैंने समाप्त कर दिया:

{% if   var >= 0 %} ${{ var|stringformat:"d" }}
{% elif var <  0 %} $({{ var|stringformat:"d"|cut:"-" }})
{% endif %}

आप भी कर सकते हैं, उदाहरण के {{ var|stringformat:"1.2f"|cut:"-" }}लिए $50.00( जैसे कि आप चाहते हैं कि 2 दशमलव स्थानों के साथ प्रदर्शित करने के लिए ।

शायद हैकी की तरफ थोड़ा सा, लेकिन शायद किसी और को यह उपयोगी लगेगा।


2

वैसे मुझे एक Django रास्ता नहीं मिल रहा है, लेकिन मुझे अपने मॉडल के अंदर से अजगर रास्ता मिल गया:

def format_price(self):
    import locale
    locale.setlocale(locale.LC_ALL, '')
    return locale.format('%d', self.price, True)

हम्म - यह कोई स्पष्टीकरण नहीं के साथ -1'd हो गया है। जो लोग सोचते हैं कि किसी तरह से उत्तर गलत है, कृपया उत्तरदाता और पाठकों के लाभ के लिए ऐसा क्यों करें। मुझे लगता है कि मैं इस एक फ़ंक्शन (मुद्रा प्राप्त करने का अप्रिय पक्ष प्रभाव) - जो -1 समझा सकता था में लोकेल (जो वैश्विक पहुंच में है) की स्थापना का प्रशंसक नहीं हूं।
डैनी स्टेपल

मैंने दूसरा -1 किया - जैसा कि प्रचलित में वर्णित है। टिप्पणी करें, यह s really not correct not giving any reason. Here itआसान है: Django को विशिष्ट टेम्पलेट मिला है (Jinja2 के समान - या यह Jinja2) जो मानक अजगर कार्यों की अनुमति नहीं देता है। तो यह उत्तर उपयोगी नहीं है। क्या अधिक है, Django ने इसे प्रबंधित करने और कुछ भी नया काम करने के लिए अपने स्वयं के फ़ंक्शन प्राप्त किए हैं जो वास्तव में अच्छा नहीं है ...
tomis

2
मैं डाउनवोटर्स से असहमत हूं - यह सुनिश्चित करने के लिए कि वैल्यू को हिट करने से पहले वैल्यू को फंक्शन में ठीक से फॉर्मेट किया गया है, खाका पूरी तरह से मान्य दृष्टिकोण जैसा लगता है।
पॉल टॉम्बलिन

1

ध्यान रखें कि स्थान बदलना प्रक्रिया-विस्तृत है और थ्रेड सुरक्षित नहीं है (iow।, इसके दुष्प्रभाव हो सकते हैं या एक ही प्रक्रिया में निष्पादित अन्य कोड को प्रभावित कर सकते हैं)।

मेरा प्रस्ताव: बैबल पैकेज देखें। Django टेम्पलेट्स के साथ एकीकरण के कुछ साधन उपलब्ध हैं।


1

सुनिश्चित नहीं हैं कि इसका उल्लेख क्यों नहीं किया गया है, अभी तक:

{% load l10n %}

{{ value|localize }}

https://docs.djangoproject.com/en/1.11/topics/i18n/formatting/#std:templatefilter-localize

आप कॉल करके अपने Django कोड (टेम्पलेट के बाहर) में भी इसका उपयोग कर सकते हैं localize(number)


1

मुहु उत्तर के आधार पर मैंने इस सरल टैग को एनकैप्सुलेटिंग पायथन string.formatविधि से किया।

  • templatetagsअपने एप्लिकेशन के फ़ोल्डर में बनाएं ।
  • format.pyउस पर एक फ़ाइल बनाएँ ।
  • इसे इसमें जोड़ें:

    from django import template
    
    register = template.Library()
    
    @register.filter(name='format')
    def format(value, fmt):
        return fmt.format(value)
  • इसे अपने टेम्पलेट में लोड करें {% load format %}
  • इसका इस्तेमाल करें। {{ some_value|format:"{:0.2f}" }}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.