Bedenkt man, unter Berücksichtigung verschiedener Eigenheiten der Datentypen und Lokalisierung, wie kann ein Webservice Geldwerte von und zu Anwendungen kommunizieren? Gibt es irgendwo einen Standard?Was ist der Standard für die Formatierung von Währungswerten in JSON?
Mein erster Gedanke war, einfach den Zahlentyp zu verwenden. Zum Beispiel
"amount": 1234.56
Ich habe viele Argumente über Probleme mit einem Mangel an Präzision und Rundungsfehler zu sehen, wenn Gleitkommadaten Typen für das Geld Berechnungen mit - wir sind jedoch nur den Wert zu übertragen, nicht zu berechnen, so dass shouldn Es ist egal.
EventBrite's JSON currency specifications etwas wie folgt angeben:
{
"currency": "USD",
"value": 432,
"display": "$4.32"
}
Bravo für Fließkommawerte zu vermeiden, aber jetzt sind wir in ein anderes Problem stoßen: Was ist die größte Zahl, die wir halten können?
One comment (Ich weiß nicht, ob es wahr ist, aber scheint vernünftig) behauptet, dass, da Zahlenimplementierungen in JSON variieren, das Beste, was Sie erwarten können, ist eine 32-Bit-Ganzzahl mit Vorzeichen. Der größte Wert, den eine vorzeichenbehaftete 32-Bit-Ganzzahl enthalten kann, ist 2147483647. Wenn wir Werte in der untergeordneten Einheit darstellen, sind das 21.474.836,47 $. 21 Millionen Dollar scheinen eine riesige Zahl zu sein, aber es ist nicht unvorstellbar, dass einige Anwendungen mit einem größeren Wert arbeiten müssen. Das Problem verschärft sich bei Währungen, bei denen 1.000 der kleineren Einheiten eine größere Einheit bilden oder bei denen die Währung weniger wert ist als der US-Dollar. Zum Beispiel ist ein tunesischer Dinar in 1.000 Milim unterteilt. 2147483647 milim oder 2147483.647 TND ist $ 1.124.492.04. Es ist sogar wahrscheinlicher, dass Werte über 1 Million $ in einigen Fällen verarbeitet werden können. Ein anderes Beispiel: Die Untereinheiten des vietnamesischen Dong wurden durch die Inflation unbrauchbar gemacht, also benutzen wir einfach größere Einheiten. 2147483647 VND ist $ 98,526.55. Ich bin mir sicher, dass viele Anwendungsfälle (Bankguthaben, Immobilienwerte usw.) wesentlich höher sind. (EventBrite muss sich wahrscheinlich nicht darum sorgen, dass die Ticketpreise so hoch sind!)
Wenn wir dieses Problem umgehen, indem wir den Wert als String mitteilen, wie sollte der String formatiert werden? Unterschiedliche Länder/Gebietsschemata haben drastisch unterschiedliche Formate - verschiedene Währungssymbole, ob das Symbol vor oder nach dem Betrag auftritt, ob ein Leerzeichen zwischen dem Symbol und dem Betrag vorhanden ist oder nicht, wenn Komma oder Punkt verwendet wird, um die Dezimaltrennzeichen zu trennen werden als Tausendertrennzeichen, Klammern oder ein Minuszeichen verwendet, um negative Werte anzuzeigen, und möglicherweise mehr, die mir nicht bekannt sind.
sollten wissen, die App, welche locale/Währung es funktioniert, kommunizieren Werte wie
"amount": "1234.56"
hin und her, und die App vertrauen richtig um die Menge zu formatieren? (Auch: sollte der Dezimalwert vermieden werden und der Wert in der kleinsten Währungseinheit angegeben werden? Oder sollte die Haupt- und Nebeneinheit in verschiedenen Eigenschaften aufgeführt sein?)
Oder sollte der Server den Rohwert und die formatierter Wert?
"amount": "1234.56"
"displayAmount": "$1,234.56"
Oder sollte der Server den Rohwert und den Währungscode bereitstellen und die App formatieren lassen? "Betrag": "1234.56" "WährungCode": "USD" Ich nehme an, welche Methode verwendet wird, sollte in beiden Richtungen verwendet werden, Übertragung an und von dem Server.
Ich konnte den Standard nicht finden - haben Sie eine Antwort oder können Sie mich auf eine Ressource verweisen, die dies definiert? Es scheint ein häufiges Problem zu sein.
Verwandte Frage: https: //stackoverflow.com/questions/45222706/what-are-the-best-practices-passing-dollar-amounts-in-json –