programing

django 템플릿의 형식 번호

telecom 2023. 6. 14. 21:40
반응형

django 템플릿의 형식 번호

숫자를 포맷하려고 합니다.예:

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

꽤 흔한 일인 것 같은데 어떤 필터를 사용해야 할지 모르겠어요.

편집: 일반적인 Python 방법이 있다면, 제 모델에 포맷된 필드를 추가할 수 있습니다.

Django의 기여된 인간화 애플리케이션은 다음과 같은 작업을 수행합니다.

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

추가해야 합니다.'django.contrib.humanize'당신에게INSTALLED_APPS에 기재.settings.py파일.

다른 답변을 바탕으로 이를 플로트로 확장하려면 다음과 같은 작업을 수행할 수 있습니다.

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

설명서: , .

네드 배첼더의 솔루션과 관련하여, 여기 소수점 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}}

설정에서 다음 행을 추가해 보십시오.py:

USE_THOUSAND_SEPARATOR = True

이게 통할 겁니다.

설명서를 참조하십시오.


2018-04-16에서 업데이트:

이를 수행하는 파이썬 방식도 있습니다.

>>> '{:,}'.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)

이 함수에서 사용자 지정 템플릿 필터를 만드는 것은 사소한 일입니다.

당신의 웹사이트가 영어로 되어 있다면 휴먼라이즈 솔루션은 괜찮습니다.다른 언어의 경우 다른 솔루션이 필요합니다.저는 바벨을 사용하는 것을 추천합니다.한 가지 해결책은 숫자를 올바르게 표시하는 사용자 지정 템플릿 태그를 만드는 것입니다.다음 절차를 수행합니다. 다음 파일을(를)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 %}
  • 미국 사용자의 경우(로컬린_)US) 1,234.56을 표시합니다.
  • 프랑스어 사용자(로컬 fr_FR)의 경우 1234,56이 표시됩니다.
  • ...

물론 변수를 대신 사용할 수 있습니다.

{% sexy_number some_variable %}

참고:context매개 변수는 현재 예제에서 사용되지 않지만 템플릿 태그를 쉽게 조정하여 템플릿 컨텍스트에 있는 모든 항목을 사용할 수 있도록 할 수 있습니다.

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

휴먼라이즈 앱은 숫자를 쉽고 빠르게 포맷할 수 있는 방법을 제공하지만 쉼표와 다른 구분 기호를 사용해야 하는 경우에는 휴먼라이즈 앱의 코드를 재사용하고 구분 기호 문자를 교체한 후 사용자 지정 필터를 만드는 것이 간단합니다.예를 들어 공백을 구분 기호로 사용합니다.

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

주제에서 약간 벗어남:

숫자를 통화로 포맷하는 방법을 찾다가 다음과 같은 질문을 발견했습니다.

$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(소수점 두 자리를 사용하는 것이 당신이 원하는 경우.

아마도 약간은 진부한 면이 있겠지만, 다른 누군가가 그것을 유용하게 여길지도 모릅니다.

가 이것을했을 때, 누가이것걸경넘우어질려에군,▁in군▁st경우.Django 2.0.2당신은 이것을 사용할 수 있습니다.

개의 분리기.형식 현지화도 읽어야 합니다.

음, 저는 장고 방법을 찾을 수 없었지만, 제 모델 안에서 파이썬 방법을 찾았습니다.

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

왜 이것이 언급되지 않았는지는 아직 확실하지 않습니다.

{% load l10n %}

{{ value|localize }}

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

당신은 또한 이것을 당신의 장고 코드(템플릿 외부)에서 사용할 수 있습니다.localize(number).

로케일 변경은 프로세스 전반에 걸쳐 수행되며 스레드 안전하지 않습니다(iow.는 부작용이 있거나 동일한 프로세스 내에서 실행되는 다른 코드에 영향을 미칠 수 있음).

제안: 바벨 패키지를 확인해 보세요.장고 템플릿과 통합하는 몇 가지 방법을 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/346467/format-numbers-in-django-templates

반응형