Quel est le standard pour la mise en forme de la valeur des devises en JSON?

En gardant à l'esprit les diverses bizarreries des types de données, et de la localisation, quelle est la meilleure façon pour un service web pour communiquer les valeurs monétaires et d'applications? Est-il un standard quelque part?

Ma première pensée a été d'utiliser simplement le type de numéro. Par exemple

"amount": 1234.56

J'ai vu beaucoup d'arguments sur les questions avec un manque de précision et les erreurs d'arrondi lors de l'utilisation de données à virgule flottante types de calculs monétaires--cependant, nous sommes juste à la transmission de la valeur, pas de calcul, de sorte que ne devrait pas d'importance.

EventBrite JSON monnaie spécifications spécifier quelque chose comme ceci:

{
"currency": "USD", 
"value": 432, 
"display": "$4.32"
}

Bravo pour éviter les valeurs à virgule flottante, mais maintenant nous avons un autre problème: quel est le plus grand nombre, on peut tenir?

Un commentaire (Je ne sais pas si c'est vrai, mais il semble raisonnable) affirme que, depuis nombre d'implémentations varient en JSON, le meilleur que vous pouvez vous attendre est un entier signé 32 bits. La plus grande valeur d'un entier signé 32 bits peut contenir 2 147 483 647. Si nous représentons les valeurs dans l'unité secondaire, c'est $21,474,836.47. 21 millions de dollars semble comme un grand nombre, mais il n'est pas inconcevable que certaines applications peuvent avoir besoin de travailler avec une valeur plus grande que celle. Le problème s'aggrave avec les monnaies où 1 000 de l'unité secondaire de faire une grande unité, ou lorsque la monnaie vaut moins que le dollar US. Par exemple, un Dinar Tunisien est divisé en 1000 milim. 2147483647 milim, ou 2147483.647 TND est $1,124,492.04. C'est encore plus susceptibles que les valeurs supérieures à 1 million de dollars peut être travaillée dans certains cas. Un autre exemple: les sous-unités de la dong Vietnamien ont été rendus inutiles par l'inflation, donc, nous allons simplement utiliser de grandes unités. 2147483647 VND est $98,526.55. Je suis sûr que beaucoup de cas d'utilisation (les soldes bancaires, les valeurs des biens immobiliers, etc.) sont nettement plus élevés que cela. (EventBrite probablement ne pas avoir à vous soucier du prix des billets étant très élevé, si!)

Si nous éviter ce problème, par la communication de la valeur sous forme de chaîne de caractères, comment la chaîne d'être formaté? Les différents pays/paramètres régionaux ont radicalement différents formats, différents symboles de devise, si le symbole a lieu avant ou après la quantité, si oui ou non il y a un espace entre le symbole et le montant, si une virgule ou un point est utilisé pour séparer les décimales, si les virgules sont utilisés comme séparateur de milliers, des parenthèses ou un signe pour indiquer les valeurs négatives, et peut-être plus que je ne suis pas au courant.

Devrait l'application de savoir ce qu'locale/de la monnaie, c'est travailler avec, de véhiculer des valeurs comme

"amount": "1234.56"

d'avant en arrière, et faire confiance à l'app pour formater correctement la quantité? (Aussi: si la valeur décimale être évitée, et la valeur spécifiée dans les termes de la plus petite unité monétaire? Ou si le majeur et mineur de l'unité de l'être présentés dans les différentes propriétés?)

Ou si le serveur de fournir de la valeur brute et la valeur formatée?

"amount": "1234.56"
"displayAmount": "$1,234.56"

Ou si le serveur de fournir de la valeur brute et le code de la devise, et laisser l'application formater?
"montant": "1234.56"
"currencyCode": "USD"
Je suppose que soit la méthode utilisée devrait être utilisé dans les deux directions, la transmission de vers et depuis le serveur.

J'ai été incapable de trouver le standard--avez-vous une réponse, ou peut m'indiquer une ressource qui la définit? Il semble comme un problème commun.

InformationsquelleAutor Chad Schultz | 2015-05-14