10
votes

Décimal à Json

Je tire une somme d'un DB qui est une valeur décimale. J'essaie d'utiliser cette valeur dans un résultat JSON xxx

django ne peut pas sérialiser le décimal . Je peux le convertir en une chaîne, mais j'aimerais un type numérique dans le JSON. Si j'essaie de le convertir en un float Je me retrouve avec plus de 2 décimales.

Quels doivent arriver, si possible, pour obtenir un résultat comme suit? < / p> xxx


3 commentaires

Je ne sais pas grand chose de Django, mais si vous avez besoin de deux décimales toujours et qu'il n'est pas possible de faire exactement ce que vous voulez que vous puissiez multiplier par 100 et travailler avec elle comme un entier.


JSON n'est défini que pour avoir des flotteurs à double précision pour les nombres. Que vous achète-t-il de garder vos chiffres comme des décimales?


Je n'ai pas besoin de mes chiffres pour être décimal, ils ne seront jamais aussi grands. C'est juste ce que je retire de la DB car ce sont des valeurs monétaires. Je n'ai pas été ravis d'utiliser l'int * 100 et les flotteurs me donnent plus de deux décimales. J'espérais juste qu'il y aurait une solution plus élégante ...


4 Réponses :


12
votes

Ce que vous pouvez faire est de prolonger la classe JSondecoder pour fournir un sérialiseur personnalisé pour le type décimal, similaire à l'exemple de ce document: http://docs.python.org/py3k/library/json.html xxx

c'est un exemple de fabrication de la façon dont le faire , espérons-le un bon point de départ pour vous.


5 commentaires

Merci, j'aime cette solution le meilleur jusqu'à présent :)


En fait, Django fournit une classe intégrée pour exactement ce - django.core.rserializers.json.djangojsonencoder - que vous pouvez utiliser directement en faisant simplejson.dumps (myDICT, classe = djangojsonencoder) < / code>. Il traite également des datetes.


@Daniel merci. 'Classe = Djangojsonencoder' nécessaire pour être "CLS = Djangojsonencoder". Cela fonctionne, mais cela me donne une valeur de chaîne :(


Hehe Cela me donne juste une valeur de chaîne identique à celle de «STR (montant)» dans les appels JSON.Dumpes ... J'ai décidé de simplement le laisser comme une chaîne et de le gérer sur le client ..


Vous pouvez le faire ce que vous voulez, changez simplement le retour "% .2f"% obj ligne.



0
votes

à partir de ce lien: http://code.google.com/ P / SimpleJson / Problèmes / Détails? ID = 34 .

Je peux vous dire que l'arbre pense:


0 commentaires

-2
votes

Il n'y a pas de type décimal dans JavaScript, ainsi que parmi les types standard de Python. C'est un type de base de données - SPCIFIC et ne fait pas partie de JSON. Prendre des flotteurs ou faire un arithmétique entier.


2 commentaires

Oui, je sais qu'il n'y a pas de type correspondant en JavaScript, mes valeurs ne seront jamais aussi grandes. Je veux simplement qu'ils sortent dans un format monétaire régulier "5.95", mais pas en format à la chaîne.


JSON Standard est indépendant de JS. Il définit également des nombres comme séquence de chiffres avec facultatif - et. Ne pas discuter de la représentation de la mémoire après avoir analysé le nombre. Decimal est également standard en Python à partir de 2,4, vous devez l'importer explicitement? C'est néanmoins intégré.



0
votes

Décimal peut être jeté sur un flotteur que JavaScript sait comment traiter xxx


1 commentaires

Dans ma question, j'ai noté que je ne voulais pas transmettre un flottant en raison d'un grand nombre de décimales.