장고 템플릿의 숫자 형식


153

숫자 형식을 지정하려고합니다. 예 :

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

그것은 매우 일반적인 일이지만, 어떤 필터를 사용해야하는지 알 수 없습니다.

편집 :이 작업을 수행하는 일반적인 파이썬 방법이 있다면 모델에 서식이 지정된 필드를 추가하는 것이 좋습니다.


3
대상 사용자가 유럽에도있는 경우주의하십시오. 독일과 같은 일부 유럽 국가에서는을 소수점으로 사용합니다.
tobltobs 2012 년

답변:


313

Django의 기여 인간화 응용 프로그램은 다음을 수행합니다.

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

추가해야 'django.contrib.humanize'당신에 INSTALLED_APPS에 목록 settings.py파일.


17
이 몇 가지 간단한 필터가 내장 필터의 일부가 아닌 이유가 있습니까?
PawelRoman

8
@PawelRoman 거의 사용되지 않는 많은 필터와 태그의로드를 피하기 위해 (그리고 템플릿 렌더링 속도를 높이기 위해)
Maxime Lorant

INSTALLED_APPS에 'django.contrib.humanize'를 추가하고 템플릿에 {% load humanize %}도 포함 시켰고 서버를 다시 시작했습니다. 그러나 "intcomma"필터를 사용하려고하면 다음 오류가 발생합니다. 잘못된 필터 : 'intcomma'디버그 추적에 settings.py에 포함 된 'django.contrib.humanize'가 표시됩니다. 가능한 문제는 무엇입니까?
Manish

1
여기에 내 자신의 문제에 대한 답이 있습니다-기본 템플릿에 {% load humanize %}가 포함되었습니다 (많은 템플릿에 필요하기 때문에). 작동하지 않는 것 같습니다. 관련 템플릿에 추가하면 정상적으로 작동합니다! :-)
Manish

작동하지 않으면 현지화 때문일 수 있습니다. 이 경우 {{my_num | intcomma : False}}를 시도하십시오
Jose Cherian

105

다른 답변을 바탕으로 이것을 수레로 확장하려면 다음을 수행하십시오.

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

설명서 : floatformat, intcomma.


59

Ned Batchelder의 솔루션에 관해서는 여기에 소수점 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'
Ahsan

1
이 코드는 [your_project] / [your_app] / templatetags / [filtername] .py에 자체 파일로 저장되어야합니다. 그런 다음 {% load [filtername] %}를 사용하여 템플릿에로드해야합니다. 보다 유용하고 구체적인 정보는 docs.djangoproject.com/en/1.10/howto/custom-template-tags 를 참조하십시오 .
mightypile

20

settings.py에 다음 줄을 추가하십시오.

USE_THOUSAND_SEPARATOR = True

이 작동합니다.

설명서를 참조하십시오 .


2018-04-16에 업데이트 :

이 작업을 수행하는 Python 방법도 있습니다.

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

10
이것을 사용할 때 조심하십시오. 또한 템플릿에 추가 한 URL 및 기타 형식으로 숫자 서식을 지정합니다.
Christoffer

4
@Christoffer의 의견을 충분히 강조 할 수는 없습니다-id가 렌더링되고 링크에 사용되는 템플릿에서는 큰 두통이 발생할 수 있습니다!
LaundroMat

장고 템플릿에는 적합하지 않습니다.
Ben

@Ben 어느 것이 적절하지 않습니까? 설정에서 "파이썬 방식"또는 천 단위 구분자 플래그? Django 템플릿에 천 구분 기호 플래그가 제대로 작동해야합니다. Django의 버전은 무엇입니까?
carton.swing

1
문자열 형식 (파이썬) 방식으로 템플릿에서 직접 사용할 수 없으므로 템플릿 태그 (이것은 정답입니다)에 넣어야하지만 이것을 버리는 것은 완전한 답으로 거의 사용되지 않습니다.
Ben

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

인간화의 웹 사이트가 영어 인 경우 솔루션은 괜찮습니다. 다른 언어의 경우 다른 솔루션이 필요합니다 . Babel을 사용하는 것이 좋습니다 . 한 가지 해결책은 숫자를 올바르게 표시하기 위해 사용자 정의 템플리트 태그를 작성하는 것입니다. 방법은 다음과 같습니다 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 = 25000.35 {{floatvalue | intcomma}}이면 '2'가 아닙니다. 25000.35
Zokis

맞습니다. 그러나이 형식은 천 단위 구분 기호 (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되었습니다-도움이되지 않습니다. 어떤 방식 으로든 대답이 틀렸다고 생각하는 사람들은 왜 응답자와 독자에게 도움이되는지 말하십시오. 나는이 하나의 기능 (통화를 얻는 데 불쾌한 부작용) -1을 설명 할 수있는 로케일 (전 세계적으로 도달하는)을 설정하는 팬이 아니라고 가정합니다.
Danny Staple

이전에 설명한대로 두 번째 -1을 수행했습니다. 코멘트, 그것은 s really not correct not giving any reason. Here it쉽습니다 : 장고 특정 템플릿을 가지고있다 (Jinja2와 유사한를 - 또는 Jinja2 그것은`) 표준 파이썬 기능을 허용하지 않는다. 따라서이 답변은 전혀 유용하지 않습니다. 더구나, Django는 이것을 관리하고 작동하는 것을 새로 작성하는 것은 정말 좋은 생각이 아닙니다 ...
tomis

2
downvoters에 동의하지 않습니다. 템플릿에 도달하기 전에보기 기능에서 값의 형식이 올바른지 확인하십시오.
Paul Tomblin

1

로케일 변경은 프로세스 전체에 적용되며 스레드로부터 안전하지 않습니다 (즉, 부작용이 있거나 동일한 프로세스 내에서 실행되는 다른 코드에 영향을 줄 수 있음).

내 제안 : Babel 패키지를 확인하십시오 . Django 템플릿과 통합하는 몇 가지 방법을 사용할 수 있습니다.



1

muhuk 답변을 기반 으로이 간단한 태그 캡슐화 파이썬 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}" }}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.