[python] 장고 템플릿의 숫자 형식

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

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

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

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



답변

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

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

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


답변

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

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

설명서 : floatformat, intcomma.


답변

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


답변

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

USE_THOUSAND_SEPARATOR = True

이 작동합니다.

설명서를 참조하십시오 .


2018-04-16에 업데이트 :

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

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


답변

로케일에 관여하지 않으려는 경우 숫자 형식을 지정하는 함수가 있습니다.

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)

이 함수에서 사용자 정의 템플릿 필터 를 만드는 것은 간단합니다.


답변

인간화의 웹 사이트가 영어 인 경우 솔루션은 괜찮습니다. 다른 언어의 경우 다른 솔루션이 필요합니다 . 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예제에서는 현재 매개 변수가 사용되지 않지만 템플릿 컨텍스트에있는 것을 사용하도록이 템플릿 태그를 쉽게 조정할 수 있음을 보여주기 위해이 매개 변수를 넣었습니다.


답변

인간화 앱 제공하는 좋은 숫자 포맷의 빠른 방법이지만 쉼표에서 분리 다른를 사용해야 할 경우에 그것의 단순한 그냥 다시 인간화 응용 프로그램의 코드를 , 분리 문자를 교체하고 사용자 정의 필터를 생성 . 예를 들어 공백 을 구분 기호로 사용하십시오.

@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)