Tenendo conto delle varie peculiarità dei tipi di dati e della localizzazione, qual è il modo migliore per un servizio Web di comunicare i valori monetari da e verso le applicazioni? C'è uno standard da qualche parte?Qual è lo standard per la formattazione dei valori di valuta in JSON?
Il mio primo pensiero è stato semplicemente utilizzare il tipo di numero. Ad esempio
"amount": 1234.56
ho visto molte discussioni sui problemi con una mancanza di precisione e di arrotondamento errori nell'uso floating point tipi di dati per i calcoli monetari - tuttavia, ci sono solo trasmettere il valore, non calcolando, in modo che shouldn non importa.
EventBrite's JSON currency specifications specificare qualcosa di simile:
{
"currency": "USD",
"value": 432,
"display": "$4.32"
}
Bravo per evitare valori in virgola mobile, ma ora ci imbattiamo in un altro problema: qual è il più grande numero possiamo tenere?
One comment (non so se è vero, ma sembra ragionevole) afferma che, dal momento che le implementazioni dei numeri variano in JSON, il meglio che puoi aspettarti è un numero intero con segno a 32 bit. Il valore più grande che un intero con segno a 32 bit può contenere è 2147483647. Se rappresentiamo valori nell'unità minore, questo è $ 21,474,836,47. $ 21 milioni sembrano un numero enorme, ma non è inconcepibile che alcune applicazioni possano aver bisogno di lavorare con un valore più grande di quello. Il problema peggiora con le valute in cui 1.000 unità minori formano un'unità principale o dove la valuta vale meno del dollaro USA. Ad esempio, un dinaro tunisino è diviso in 1.000 milim. 2147483647 milim, o 2147483.647 TND è $ 1,124,492,04. È ancora più probabile che in alcuni casi vengano utilizzati valori superiori a $ 1 milione. Un altro esempio: le sottounità dei dong vietnamiti sono state rese inutili dall'inflazione, quindi usiamo solo le unità principali. 2147483647 VND è $ 98,526,55. Sono sicuro che molti casi d'uso (saldi bancari, valori immobiliari, ecc.) Sono sostanzialmente più alti di così. (EventBrite probabilmente non deve preoccuparsi che i prezzi dei biglietti siano così alti, però!)
Se evitiamo questo problema comunicando il valore come una stringa, come deve essere formattata la stringa? Diversi paesi/località hanno formati drasticamente diversi, diversi simboli di valuta, se il simbolo si verifica prima o dopo l'importo, indipendentemente dal fatto che vi sia uno spazio tra il simbolo e l'importo, se viene utilizzata una virgola o un punto per separare il decimale, se le virgole sono usati come separatore di migliaia, parentesi o un segno meno per indicare valori negativi, e possibilmente più di cui non sono a conoscenza.
Qualora l'applicazione sapere locale/moneta si sta lavorando con, comunicare i valori come
"amount": "1234.56"
avanti e indietro, e la fiducia l'applicazione per formattare correttamente la quantità? (Inoltre: il valore decimale deve essere evitato e il valore specificato in termini di unità monetaria più piccola? O l'unità principale e secondaria deve essere elencata in proprietà diverse?)
Oppure il server deve fornire il valore grezzo e valore formattato?
"amount": "1234.56"
"displayAmount": "$1,234.56"
Oppure il server deve fornire il valore grezzo e il codice valuta e lasciare che l'app lo formatti? "importo": "1234.56" "currencyCode": "USD" Presumo che qualsiasi metodo utilizzato debba essere utilizzato in entrambe le direzioni, trasmettendo da e verso il server.
Non riesco a trovare lo standard - avete una risposta o potete indicarmi una risorsa che lo definisce? Sembra un problema comune.
questione connessa: https: //stackoverflow.com/questions/45222706/what-are-the-best-practices-passing-dollar-amounts-in-json –