Które pole modelu django jest najlepsze do reprezentowania kwoty w dolarach amerykańskich?


104

Muszę przechowywać kwotę w dolarach amerykańskich w polu modelu Django. Jaki jest najlepszy typ pola modelu do użycia? Muszę mieć możliwość wprowadzenia tej wartości przez użytkownika (ze sprawdzaniem błędów, chcę, aby liczba była dokładna tylko do centów), sformatowania jej w celu wyświetlenia użytkownikom w różnych miejscach i użycia jej do obliczenia innych liczb.

Odpowiedzi:


167

Pole dziesiętne to właściwy wybór dla wartości waluty.

Będzie wyglądać mniej więcej tak:

credit = models.DecimalField(max_digits=6, decimal_places=2)

100
Chyba że chcesz reprezentować dług publiczny, w którym to przypadku max_digits musi być> 20
Bron Davies

4
decimal_places = 2 niekoniecznie jest poprawne, jeśli potrzebujesz tego do obsługi innych walut. Niektóre waluty mają trzy miejsca po przecinku, a Bitcoin ma krzykliwe 8.
Lie Ryan

2
Myślę, że ten przykład jest poprawny dla prawie wszystkich walut. Myślę, że aby przedstawić waluty jako Bitcoin, myślę, że znacznie lepiej jest użyć pola liczb całkowitych, aby zapisać kwotę w satoshi, a następnie pokazać ją użytkownikowi końcowemu w żądanej reprezentacji (BTC, mBTC itp.)
Jion

Chyba że chcesz przedstawić dług publiczny Wenezueli w walucie krajowej wenezueli, w którym to przypadku potrzebujesz 21 max_digits
Luis Sieira

@LieRyan to prawda. Musimy wziąć pod uwagę współczesne rodzaje „waluty”, aby zapobiec przyszłym modyfikacjom bazy danych. Używanie cudzysłowu nie jest przestępstwem.
enchance


35

Pozostałe odpowiedzi są w 100% poprawne, ale nie są zbyt praktyczne, ponieważ nadal będziesz musiał ręcznie zarządzać wyjściem, formatowaniem itp.

Sugerowałbym użycie django-money :

from djmoney.models.fields import MoneyField
from django.db import models


def SomeModel(models.Model):
    some_currency = MoneyField(
        decimal_places=2,
        default=0,
        default_currency='USD',
        max_digits=11,
    )

Działa automatycznie z szablonów:

{{ somemodel.some_currency }}

Wynik:

$123.00

Ma potężne zaplecze za pośrednictwem Python-Money i jest zasadniczo zamiennikiem standardowych pól dziesiętnych.


(ze sprawdzaniem błędów, chcesz, aby liczba była dokładna do centów), sformatuj ją w celu wyświetlenia użytkownikom w różnych miejscach i użyj jej do obliczenia innych liczb. W takich przypadkach użycie DecimalFieldjest bardziej praktyczne. Uważam, że jest stosowany u większości ludzi. Używając, django-moneyjak podkreślili, uwzględnij obsługę walut . Jest to więc bardziej dla projektów obejmujących transakcje, takie jak witryny e-commerce, bramki płatności, waluta cyfrowa, bankowość itp.
Yeo

Twierdzę, że ponieważ pracują z USD - walutą - bardziej sensowne jest korzystanie z biblioteki obsługującej walutę, takiej jak django-money (python-money), ponieważ sprawia, że ​​wszystko działa tak, jak można się spodziewać i zapewnia przyszłe dostosowania funkcji. Pierwotne pytanie mówi, że potrzebują formatowania i obliczeń (jak cytowałeś), a do tego lepiej jest użyć biblioteki walut zamiast prostego pola dziesiętnego.
Michael Thompson,

1
A jeśli chcę dodać dwa pola pieniędzy lub wykonać obliczenia?
saran3h

1
@ saran3h możesz pracować z instancjami pieniędzy i wykonywać obliczenia jak każda inna instancja liczbowa (dziesiętna). Możesz dodawać / odejmować, mnożyć przez liczby całkowite itp.
Michael Thompson,

9

Zdefiniuj ułamek dziesiętny i zwróć znak $ przed wartością.

    price = models.DecimalField(max_digits=8, decimal_places=2)

    @property
    def price_display(self):
        return "$%s" % self.price

6
Zdajesz sobie sprawę, że właśnie utworzyłeś nieskończoną pętlę rekurencji w swojej własności, prawda?
El Ninja Trepador

Ciekawy. Mogę zapytać, jak to?
kingraphaii

2
field = models.DecimalField(max_digits=8, decimal_places=2)

Powinien utworzyć pole dla PostgreSQL takie jak:

 "field" numeric(8, 2) NOT NULL

Jaki jest najlepszy sposób na przechowywanie w PostGreSQL kwoty w dolarach amerykańskich.

Jeśli potrzebujesz pola PostgreSQL typu „podwójna precyzja”, musisz to zrobić w modelu django:

field = models.FloatField()

3
Uważaj na przedstawianie pieniędzy jako liczby zmiennoprzecinkowej, ponieważ ludzie są zwykle niezadowoleni z powodu błędów zaokrąglania pieniędzy. Więcej informacji znajdziesz na: stackoverflow.com/questions/3730019/… .
Adam Parkin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.