2010-10-26 4 views
7

Я вытягиваю сумму из базы данных, которая является десятичным значением. Я пытаюсь использовать это значение в результате JSONDecimal to JSON

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

Джанго не может сериализовать Decimal. Я могу преобразовать его в строку, но мне нужен цифровой тип в JSON. Если я попытаюсь преобразовать его в float, я получаю более двух знаков после запятой.

Что должно произойти, если возможно, чтобы получить результат следующим образом?

{ 'sum': 500.50 } 
+0

Я не знаю много о Джанго, но если вам нужны два знака после запятой всегда, и это не возможно сделать именно то, что вы хотите, чтобы вы могли умножить на 100 и работать с ним как целое. – cambraca

+1

JSON определяется только для чисел с плавающей запятой двойной точности. Что вы купите, чтобы ваши цифры были Десятичными? – Gabe

+0

Мне не нужно, чтобы мои цифры были десятичными, они никогда не будут такими большими. Это именно то, что я получаю от БД, поскольку это денежные ценности. Я не был в восторге от использования int * 100, и поплавки дают мне больше двух знаков после запятой. Я просто надеялся, что будет более элегантное решение ... – Justin

ответ

11

Что вы можете сделать, это расширить класс JSONDecoder предоставить пользовательский сериалайзер для десятичного типа, похожий на пример в данном документе: 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) 
... 

Это нерабочим пример того, как это сделать это, надеюсь, хорошая отправная точка для вас.

+0

Спасибо, мне нравится, что это лучшее решение до сих пор :) – Justin

+10

На самом деле Django предоставляет встроенный класс именно для этого - 'django.core.serializers.json.DjangoJSONEncoder '- которую вы можете использовать непосредственно, выполнив' simplejson.dumps (mydict, class = DjangoJSONEncoder) '. Это также касается времени. –

+3

@ Daniel Спасибо. 'class = DjangoJSONEncoder' должен быть 'cls = DjangoJSONEncoder'. Это действительно работает, но оно дает мне строковое значение :( – Justin

0

С этой ссылкой: http://code.google.com/p/simplejson/issues/detail?id=34.

я могу вам сказать, дерево думает:

вы можете найти более подробную информацию в первой ссылке.

0

В Javascript нет такой вещи, как десятичный тип, а также среди стандартных типов в python. Это тип базы данных, а не часть JSON. Возьмите Float или выполните целочисленную арифметику.

+0

Да, я знаю, что в JavaScript нет соответствующего типа, мои ценности никогда не будут такими большими. Я просто хочу, чтобы они спустились в обычном денежном формате «5.95», но не в строчном формате. – Justin

0

Десятичные может быть приведена к поплавку, который Javascript знает, как бороться с

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

В моем вопросе я заметил, что я не хотел пропускать поплавок из-за большого количества десятичных знаков. – Justin