回答:
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}}
>>> currency(0.99958) u'$0.00'
settings.pyに次の行を追加してみてください:
USE_THOUSAND_SEPARATOR = True
これはうまくいくはずです。
ドキュメントを参照してください。
2018年4月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の使用をお勧めします。1つの解決策は、数値を適切に表示するカスタムテンプレートタグを作成することです。方法は次のとおりです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 %}
もちろん、代わりに変数を使用できます。
{% 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)
少し外れたトピック:
次のように、数値を通貨としてフォーマットする方法を探しているときに、この質問を見つけました。
$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桁で。
たぶん少しハッキーな側面ですが、多分誰かがそれを役に立つと思うでしょう。
まあ、私はDjangoの方法を見つけることができませんでしたが、モデル内からpythonの方法を見つけました。
def format_price(self):
import locale
locale.setlocale(locale.LC_ALL, '')
return locale.format('%d', self.price, True)
s really not correct not giving any reason. Here it
簡単です:Djangoは標準のpython関数を許可しない特定のテンプレート(Jinja2に似ている-またはそれのJinja2)を持っています。したがって、この答えはまったく役に立ちません。さらに、Djangoはこれを管理する独自の機能を備えており、機能しているものを新しいものに書き込むことは、あまり良い考えではありません...
なぜこれが言及されていないのかはまだわかりません:
{% load l10n %}
{{ value|localize }}
https://docs.djangoproject.com/en/1.11/topics/i18n/formatting/#std:templatefilter-localize
を呼び出して、Djangoコード(テンプレート外)でこれを使用することもできますlocalize(number)
。
muhukの回答に基づいて、この単純なタグカプセル化Python 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}" }}
誰かがこれにつまずいた場合、Django 2.0.2
あなたはこれを使うことができます
千の区切り。フォーマットのローカライズも必ずお読みください。