2010-10-26 14 views
7

Wyciągam sumę z DB, która jest wartością dziesiętną. Próbuję użyć tej wartości w wyniku JSONDziesiętny do JSON

json.dumps({ 'sum': amount }) #where amount is my Decimal 

Django nie można serializować Decimal. Mogę przekonwertować go na ciąg, ale chciałbym numeryczny typ w JSON. Jeśli spróbuję przekonwertować go na float, otrzymam więcej niż 2 miejsca po przecinku.

Co musi się stać, jeśli to możliwe, aby uzyskać wynik podobny do następującego?

{ 'sum': 500.50 } 
+0

nie wiem zbyt wiele o Django, ale jeśli potrzebujesz dwóch miejsc po przecinku zawsze i to nie jest możliwe, aby zrobić dokładnie to, co chcesz, abyś pomnożył przez 100 i używał go jako liczby całkowitej. – cambraca

+1

JSON jest zdefiniowany tylko jako przeplot o podwójnej precyzji dla liczb. Co Cię kupuje, aby zachować swoje liczby jako liczby dziesiętne? – Gabe

+0

Nie potrzebuję liczb, które mają być dziesiętne, nigdy nie będą tak duże. Właśnie to otrzymuję z DB, ponieważ są to wartości pieniężne. Nie byłem zachwycony z użycia int * 100, a spacje dają mi więcej niż dwa miejsca po przecinku. Miałem tylko nadzieję, że pojawi się bardziej eleganckie rozwiązanie ... – Justin

Odpowiedz

11

Co można zrobić, to rozszerzyć klasę JSONDecoder dostarczyć niestandardowe serializatora dla dziesiętny typ, podobny do przykładu w niniejszym dokumencie: http://docs.python.org/py3k/library/json.html

>>> import json 
>>> class DecimalEncoder(json.JSONEncoder): 
...  def default(self, obj): 
...   if isinstance(obj, Decimal): 
...    return "%.2f" % obj 
...   return json.JSONEncoder.default(self, obj) 
... 

To jałowy przykładem, jak to zrobić to, mam nadzieję, dobry punkt wyjścia dla ciebie.

+0

Dzięki, lubię to rozwiązanie jak do tej pory najlepsze :) – Justin

+10

Właściwie Django zapewnia w tym celu wbudowaną klasę - 'django.core.serializers.json.DjangoJSONEncoder '- którego możesz użyć bezpośrednio, wykonując' simplejson.dumps (mydict, class = DjangoJSONEncoder) '. Zajmuje się także datetimes. –

+3

@Daniel Dzięki. "class = DjangoJSONEncoder" musi być "cls = DjangoJSONEncoder". To działa, ale daje mi wartość ciągu :( – Justin

0

Nie ma czegoś takiego jak typ dziesiętny w JavaScript, a także wśród standardowych typów w Pythonie. Jest to typ bazy danych typu spcific i nie jest częścią JSON. Take Float lub wykonaj arytmetykę całkowitą.

+0

Tak, wiem, że w JavaScript nie ma pasującego typu, moje wartości nigdy nie będą tak duże. Po prostu chcę, żeby pojawiły się w zwykłym formacie pieniężnym "5,95", ale nie w formacie smyczkowym. – Justin

0

dziesiętne mogą być oddane do pływaka, który javascript wie, jak radzić sobie z

json.dumps({ 'sum': float(amount) }) 
+0

W moim pytaniu zauważyłem, że nie chciałem przekazać pływaka z powodu dużej liczby miejsc po przecinku. – Justin