it-swarm.com.de

Formatieren Sie Zahlen in Django Vorlagen

Ich versuche, Zahlen zu formatieren. Beispiele:

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

Es scheint eine ziemlich übliche Sache zu sein, aber ich kann nicht herausfinden, welchen Filter ich verwenden soll.

Bearbeiten: Wenn Sie eine generische Python Möglichkeit haben, dies zu tun, füge ich meinem Modell gerne ein formatiertes Feld hinzu.

139
Oli

Djangos beigetragenes humanisieren Programm macht das:

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

Stellen Sie sicher, dass Sie 'Django.contrib.humanize' Zu Ihrer INSTALLED_APPS - Liste in der Datei settings.py Hinzufügen.

270
Ned Batchelder

Aufbauend auf anderen Antworten können Sie Folgendes tun, um dies auf Floats zu erweitern:

{% load humanize %}
{{ floatvalue|floatformat:2|intcomma }}
96
Vinod Kurup

Bei der Lösung von Ned Batchelder handelt es sich um eine Lösung mit zwei Dezimalstellen und einem Dollarzeichen. Das geht irgendwo wie 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)

Dann kannst du

{% load my_filters %}
{{my_dollars | currency}}
58

Versuchen Sie, die folgende Zeile in settings.py einzufügen:

USE_THOUSAND_SEPARATOR = True

Das sollte funktionieren.

Siehe Dokumentation .


aktualisierung am 16.04.2018:

Es gibt auch eine python Möglichkeit, dies zu tun:

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

Wenn Sie sich nicht mit Gebietsschemas befassen möchten, finden Sie hier eine Funktion zum Formatieren von Zahlen:

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)

Das Erstellen eines benutzerdefinierten Vorlagenfilters aus dieser Funktion ist trivial.

11
muhuk

Die humanize -Lösung ist in Ordnung, wenn Ihre Website auf Englisch ist. Für andere Sprachen benötigen Sie eine andere Lösung: Ich empfehle Babel . Eine Lösung besteht darin, ein benutzerdefiniertes Vorlagen-Tag zu erstellen, um die Zahlen korrekt anzuzeigen. So geht's: Erstellen Sie einfach die folgende Datei in 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)

Dann können Sie dieses Template-Tag in Ihren Templates wie folgt verwenden:

{% load sexy_number from sexify %}

{% sexy_number 1234.56 %}
  • Für einen amerikanischen Benutzer (locale en_US) wird hier 1.234,56 angezeigt.
  • Für einen französischen Benutzer (Gebietsschema fr_FR) wird 1 234,56 angezeigt.
  • ...

Natürlich können Sie stattdessen Variablen verwenden:

{% sexy_number some_variable %}

Hinweis: Der Parameter context wird derzeit in meinem Beispiel nicht verwendet, aber ich habe ihn dort abgelegt, um zu zeigen, dass Sie diese Vorlage einfach optimieren können Tag, damit es alles verwendet, was sich im Vorlagenkontext befindet.

10
MiniQuark

Die humanize app bietet eine nette und schnelle Möglichkeit, eine Zahl zu formatieren. Wenn Sie jedoch ein anderes Trennzeichen als das Komma verwenden müssen, können Sie den Code aus humanize einfach wiederverwenden app , ersetze das Trennzeichen und erstelle einen benutzerdefinierten Filter . Verwenden Sie beispielsweise Leerzeichen als Trennzeichen:

@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)
4
Enis Afgan

Leicht vom Thema abweichend:

Ich habe diese Frage gefunden, als ich nach einer Möglichkeit gesucht habe, eine Zahl wie folgt als Währung zu formatieren:

$100
($50)  # negative numbers without '-' and in parens

Am Ende machte ich:

{% if   var >= 0 %} ${{ var|stringformat:"d" }}
{% Elif var <  0 %} $({{ var|stringformat:"d"|cut:"-" }})
{% endif %}

Sie könnten auch z. {{ var|stringformat:"1.2f"|cut:"-" }} zur Anzeige als $50.00 (mit 2 Nachkommastellen, wenn Sie möchten.

Vielleicht etwas verrückt, aber vielleicht findet es jemand anderes nützlich.

3
Felix Böhme

Nun, ich konnte keinen Django Weg finden, aber ich habe einen python Weg in meinem Modell gefunden:

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

Basierend auf Muhuk Antwort habe ich dieses einfache Tag gekapselt python string.format Methode.

  • Erstellen Sie ein templatetags in Ihrem Anwendungsordner.
  • Ein ... kreieren format.py Datei darauf.
  • Fügen Sie dies hinzu:

    from Django import template
    
    register = template.Library()
    
    @register.filter(name='format')
    def format(value, fmt):
        return fmt.format(value)
    
  • Lade es in deine Vorlage {% load format %}
  • Benutze es. {{ some_value|format:"{:0.2f}" }}
1
geckos

Beachten Sie, dass das Ändern des Gebietsschemas prozessweit und nicht threadsicher ist (dies kann Nebenwirkungen haben oder sich auf anderen Code auswirken, der innerhalb desselben Prozesses ausgeführt wird).

Mein Vorschlag: Schauen Sie sich das Babel -Paket an. Einige Möglichkeiten zur Integration in Django Vorlagen sind verfügbar.

1
zgoda

Für den Fall, dass jemand darauf stößt, in Django 2.0.2 Sie können dies verwenden

Tausendertrennzeichen . Lesen Sie unbedingt auch Formatlokalisierung .

0
chidimo

Nicht sicher, warum dies noch nicht erwähnt wurde:

{% load l10n %}

{{ value|localize }}

https://docs.djangoproject.com/de/1.11/topics/i18n/formatting/#std:templatefilter-localize

Sie können dies auch in Ihrem Django Code (außerhalb von Vorlagen) verwenden, indem Sie localize(number) aufrufen.

0
Risadinha