Pamiętając o różnych dziwactwach typów danych i lokalizacji, jaki jest najlepszy sposób, aby usługa sieciowa komunikowała wartości pieniężne do iz aplikacji? Czy gdzieś istnieje jakiś standard?Jaki jest standard formatowania wartości walut w JSON?
Moją pierwszą myślą było po prostu użyć typu numeru. Na przykład
"amount": 1234.56
Widziałem wiele argumentów o problemach z brakiem precyzji i błędów zaokrąglania podczas korzystania pływających typów danych punktowych dla obliczeń pieniężnej - jednak jesteśmy tylko przekazywaniu wartości, a nie obliczenia, tak że powinnam Nieważne.
EventBrite's JSON currency specifications określić coś takiego:
{
"currency": "USD",
"value": 432,
"display": "$4.32"
}
Bravo dla uniknięcia pływających wartości punktowe, ale teraz możemy uruchomić w innej kwestii: co to największa liczba możemy trzymać?
One comment (Nie wiem, czy to prawda, ale wydaje się uzasadnione) twierdzi, że ponieważ implementacje liczb różnią się w JSON, najlepsze, czego można się spodziewać, to 32-bitowa liczba całkowita ze znakiem. Największa wartość, jaką może pomieścić 32-bitowa liczba całkowita ze znakiem, wynosi 2147483647. Jeśli reprezentujemy wartości w jednostce podrzędnej, jest to 21 474 846,47 USD. 21 milionów dolarów wydaje się być ogromną liczbą, ale nie jest wykluczone, że niektóre aplikacje mogą wymagać większej wartości. Problem pogłębia się w przypadku walut, w których 1000 jednostki mniejszej tworzy główną jednostkę, lub gdy waluta jest warta mniej niż dolar amerykański. Na przykład dinar tunezyjski jest podzielony na 1000 mil. 2147483647 milim, czyli 2147483.647 TND wynosi 1 124 492,04 USD. Jest jeszcze bardziej prawdopodobne, że w niektórych przypadkach można pracować z wartościami powyżej 1 miliona USD. Inny przykład: podjednostki wietnamskiego dongu stały się bezużyteczne z powodu inflacji, więc używajmy głównych jednostek. 2147483647 VND to 98.522,55 £. Jestem pewien, że wiele przypadków użycia (salda bankowe, wartości nieruchomości itp.) Jest znacznie wyższe. (EventBrite prawdopodobnie nie musi się martwić, że ceny biletów są tak wysokie!)
Jeśli unikniemy tego problemu, przekazując wartość jako łańcuch, w jaki sposób powinien być sformatowany ciąg znaków? Różne kraje/lokalizacje mają drastycznie różne formaty - różne symbole walut, niezależnie od tego, czy symbol występuje przed czy po kwocie, niezależnie od tego, czy między symbolem a kwotą jest spacja, czy przecinek lub kropka są używane do rozdzielenia części dziesiętnej, czy przecinki są używane jako separatory tysięcy, nawiasy lub znak minus, aby wskazać wartości ujemne i być może więcej, o których nie wiem.
Jeżeli aplikacja wie, co locale/waluta to działa z, komunikować wartości jak
"amount": "1234.56"
tam iz powrotem, i uwierzcie aplikację do poprawnego formatowania kwotę? (Także: czy należy unikać wartości dziesiętnej i wartości określonej w najmniejszej jednostce pieniężnej? Czy jednostka główna i drugorzędna powinna być wymieniona w różnych nieruchomościach?)
Czy serwer powinien podać wartość początkową i sformatowana wartość?
"amount": "1234.56"
"displayAmount": "$1,234.56"
Czy serwer powinien podać wartość początkową i kod waluty, a następnie pozwolić aplikacji na sformatowanie? "amount": "1234.56" "currencyCode": "USD" Zakładam, że dowolna z metod jest używana w obu kierunkach, przesyłana do iz serwera.
Nie mogę znaleźć standardu - czy masz odpowiedź, czy możesz wskazać mi zasób, który to definiuje? Wydaje się, że jest to typowy problem.
pokrewne pytanie: https: //stackoverflow.com/questions/45222706/what-are-the-best-practices-passing-dollar-amounts-in-json –