জ্যাঙ্গো টেমপ্লেটগুলিতে সংখ্যার ফর্ম্যাট করুন


154

আমি সংখ্যা বিন্যাস করার চেষ্টা করছি। উদাহরণ:

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

এটি করা মোটামুটি সাধারণ জিনিস হিসাবে আঘাত করে তবে আমার কোন ফিল্টারটি ব্যবহার করা উচিত তা আমি বুঝতে পারি না।

সম্পাদনা করুন: আপনি যদি জেনেরিক পাইথন এটি করার উপায় করেন তবে আমি আমার মডেলটিতে ফর্ম্যাট ফিল্ড যুক্ত করে খুশি happy


3
আপনার লক্ষ্যযুক্ত ব্যবহারকারীরাও যদি ইউরোপে থাকেন তবে সাবধান হন। জার্মানির মতো কিছু ইউরোপীয় দেশ দশমিক চিহ্ন হিসাবে ব্যবহার করে।
tobltobs

উত্তর:


312

জ্যাঙ্গোর অবদানের মানবিক প্রয়োগ এটি করে:

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

ফাইলটিতে 'django.contrib.humanize'আপনার INSTALLED_APPSতালিকায় যোগ করার বিষয়ে নিশ্চিত হন settings.py


17
এই কয়েকটি সাধারণ ফিল্টারগুলি অন্তর্নির্মিত ফিল্টারগুলির অংশ না হওয়ার কোনও কারণ আছে কি?
পাভেলরোমন

8
@ পাওয়েলরোমন খুব কম ব্যবহৃত ফিল্টার এবং ট্যাগের গুচ্ছ লোড এড়াতে (এবং তাই টেমপ্লেটটি দ্রুততর করে তোলে)
ম্যাক্সিম লর্যান্ট

আমি INSTALLED_APPS এ 'django.contrib.humanize' যুক্ত করেছি এবং আমার টেম্পলেটে load% লোড হিউম্যানাইজ% included অন্তর্ভুক্ত করেছি এবং সার্ভারটি পুনরায় চালু করেছি। যাইহোক, আমি যখন "ইন্টকমমা" ফিল্টারটি ব্যবহার করার চেষ্টা করি তখন আমি এই ত্রুটিটি পেয়েছি - অবৈধ ফিল্টার: 'ইনটকমমা' ডিবাগ ট্রেসটি 'django.contrib.humanize' সেটিংস.প্যাটিতে অন্তর্ভুক্ত দেখায়। কী সমস্যা হতে পারে?
মনীষ

1
আমার নিজের সমস্যার এখানে উত্তর পেয়েছি - আমি বেস টেমপ্লেটে load% লোড হিউম্যানাইজড% included অন্তর্ভুক্ত করেছি (যেহেতু আমার এটি প্রচুর টেমপ্লেটের প্রয়োজন)। দেখে মনে হচ্ছে এটি কার্যকর হয় না - যখন আমি এটি প্রাসঙ্গিক টেম্পলেটগুলিতে যুক্ত করেছি, এটি দুর্দান্ত কাজ করেছে! :-)
মনিশ

যদি এটি কাজ না করে তবে এটি স্থানীয়করণের কারণে হতে পারে। সেই ক্ষেত্রে {{my_num | intcomma: মিথ্যা Try Try চেষ্টা করুন
জোসে চেরিয়ান

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
এই কোডটি [আপনার_প্রজেক্ট] / [আপনার_অ্যাপ] / টেম্পলেট ট্যাগগুলি / [ফিল্টারনাম] .py এ নিজস্ব ফাইলে যেতে হবে। এরপরে এটি the% লোড [ফিল্টারনাম]% with সহ টেমপ্লেটে লোড করা উচিত} আরও সহায়ক এবং সুনির্দিষ্ট তথ্যের জন্য ডকস.ডজ্যাঙ্গোপ্রজেক্ট.com/en/1.10/howto/custom-template-tags দেখুন ।
পরাশক্তি 1

20

সেটিংস.পিতে নিম্নলিখিত লাইনটি যুক্ত করার চেষ্টা করুন:

USE_THOUSAND_SEPARATOR = True

এই কাজ করা উচিত.

পড়ুন ডকুমেন্টেশন


2018-04-16 এ আপডেট করুন:

এটি করার একটি অজগর উপায়ও রয়েছে:

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

10
এটি ব্যবহার করার সময় যত্নশীল হন। ইউআরএলগুলিতে এবং আপনি যে টেমপ্লেটে যুক্ত করেছেন সেগুলিতে সংখ্যার ফর্ম্যাটও দেবে
ক্রিস্টোফার

4
আমি @ ক্রিসটফফারের মন্তব্যকে যথেষ্ট চাপ দিতে পারি না - টেমপ্লেটগুলিতে যেখানে আইডি রেকর্ড করা হয় এবং লিঙ্কগুলিতে ব্যবহৃত হয়, এটি বড় মাথাব্যথার কারণ হতে পারে!
লন্ড্রোম্যাট

এটি জাজানো টেমপ্লেটগুলির জন্য উপযুক্ত নয়
বেন

@ বেন কোনটি উপযুক্ত নয়? "অজগর পথ" বা সেটিংসে হাজার বিভাজক পতাকা? জাজানো টেম্পলেটগুলির জন্য হাজার বিভাজক পতাকাটি ভালভাবে কাজ করা উচিত your আপনার জাঙ্গোর সংস্করণটি কী?
কার্টন.সুইং

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
আমার স্থানীয় অবস্থান 'পিটি_বিআর' এবং "ইনটকমমা" এমনকি ব্রাজিলে 'এর দ্বারা বিচ্ছেদ হয়ে কাজ করে।' এবং 'দ্বারা' নয়, ফ্লোটভ্যালু হচ্ছে = 25000.35 {at ফ্ল্যাটভ্যালু | ইনটকমমা} 25 এর ফলাফল 25000.35
জোকিস

আপনি ঠিক বলেছেন তবে এই ফর্ম্যাটটি হাজার হাজার বিভাজক (en_US এর জন্য 25,000.35 এবং fr_FR এর জন্য 25,000,35) সম্পর্কিত উপযুক্ত নয়।
MiniQuark

4

আরো সুরুচিকর অ্যাপ্লিকেশন অফার একটা চমৎকার এবং একটি সংখ্যা বিন্যাস একটি দ্রুত উপায় কিন্তু আপনি কমা থেকে একটি বিভাজক বিভিন্ন ব্যবহার করার দরকার হয়, এটা এর সহজ শুধু পুনরায় ব্যবহার সুরুচিকর অ্যাপ্লিকেশন থেকে কোড , বিভাজক গৃহস্থালির কাজ প্রতিস্থাপন, এবং একটি কাস্টম ফিল্টার তৈরি । উদাহরণস্বরূপ, পৃথককারী হিসাবে স্থান ব্যবহার করুন :

@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

আচ্ছা, আমি জ্যাঙ্গো পথটি খুঁজে পাইনি, তবে আমি আমার মডেলের অভ্যন্তর থেকে অজগর পথটি পেয়েছি:

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

হুঁ - এটি -1 'হয়েছে, কোনও ব্যাখ্যা ছাড়াই - সহায়তা করা। যারা উত্তরটি কোনওভাবেই ভুল বলে মনে করেন, তাদের জন্য দয়া করে কেন বলবেন যে উত্তরদাতা এবং পাঠকদের পক্ষে। আমি মনে করি আমি লোকাল সেট করার ভক্ত নই (যা পৌঁছানোর ক্ষেত্রে বৈশ্বিক) এই একটি ফাংশনে (মুদ্রা পাওয়ার ক্ষেত্রে অপ্রীতিকর দিকটি প্রভাবিত হয়) - যা -১ ব্যাখ্যা করতে পারে।
ড্যানি স্ট্যাপল

আমি দ্বিতীয় -১ করলাম - যেমন পূর্বের বর্ণিত। মন্তব্য, এটি s really not correct not giving any reason. Here itসহজ: জ্যাঙ্গো একটি নির্দিষ্ট টেম্পলেট পেয়েছে (জিনজা ২ - বা এটি জিনজা ২ এর সমান) যা মানক পাইথন ফাংশনগুলিকে অনুমতি দেয় না। সুতরাং এই উত্তরটি মোটেই কার্যকর নয়। আরও কী,
জাজানো

2
আমি ডাউনভোটারদের সাথে একমত নই - এই টেমপ্লেটটিকে হিট করার আগে ভিউ ফাংশনে মানটি সঠিকভাবে ফর্ম্যাট করা হয়েছে কিনা তা নিশ্চিত করে নিখুঁতভাবে বৈধ পদ্ধতির মতো দেখায়।
পল টমলিন

1

সচেতন থাকুন যে স্থানীয় পরিবর্তনটি প্রক্রিয়া-ব্যাপী এবং থ্রেড নিরাপদ নয় (যেমন, এর পার্শ্ব প্রতিক্রিয়া থাকতে পারে বা একই প্রক্রিয়ার মধ্যে সম্পাদিত অন্যান্য কোডকে প্রভাবিত করতে পারে)।

আমার প্রস্তাব: বাবেল প্যাকেজটি দেখুন। জ্যাঙ্গো টেমপ্লেটগুলির সাথে সংহত করার কিছু উপায় উপলব্ধ।



1

Muhuk উত্তরের উপর ভিত্তি করে আমি পাইথন string.formatপদ্ধতিটি এই সহজ ট্যাগটি encapsulating করেছি ।

  • 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}" }}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.