Принимая во внимание различные причуды типов данных и локализацию, каков наилучший способ для веб-службы передавать денежные значения в приложения и из приложений? Где-то есть стандарт?Каков стандарт форматирования валютных значений в JSON?
Моя первая мысль состояла в том, чтобы просто использовать тип номера. Например
"amount": 1234.56
Я видел много споров о проблемах с отсутствием точности и ошибок округления при использовании плавающих типов данных точек для денежных расчетов - однако, мы просто передаем значение, а не вычисление, так что не должна Не важно.
EventBrite's JSON currency specifications указать что-то вроде этого:
{
"currency": "USD",
"value": 432,
"display": "$4.32"
}
Bravo для избежания значений с плавающей точкой, но теперь мы столкнулись с другой проблемой: что самое большое число, которое мы можем провести?
One comment (Я не знаю, правда ли это, но кажется разумным) утверждает, что, поскольку реализация чисел в JSON варьируется, лучшее, что вы можете ожидать, это 32-разрядное целое число со знаком. Наибольшее значение, которое может содержать 32-разрядное целое число со знаком, равно 2147483647. Если мы представляем значения в младшей единице, это составляет 21 474 836,47 долларов. $ 21 млн. Кажется огромным количеством, но не исключено, что некоторым приложениям, возможно, придется работать со значением, большим, чем это. Проблема ухудшается с валютами, где 1000 второстепенной единицы составляют основную единицу или где валюта стоит меньше, чем доллар США. Например, Тунисский Динар разделен на 1000 миллионов. 2147483647 milim, или 2147483.647 TND составляет 1 124 492,04 доллара США. В некоторых случаях даже более вероятные значения превышают 1 миллион долларов. Другой пример: подразделениями вьетнамских донов были бесполезны инфляция, поэтому давайте просто использовать основные подразделения. 2147483647 VND - $ 98 526,55. Я уверен, что многие случаи использования (банковские балансы, стоимость недвижимости и т. Д.) Значительно выше. (EventBrite, вероятно, не стоит беспокоиться о том, что цены на билеты настолько высоки, хотя!)
Если мы избежим этой проблемы, передав значение в виде строки, как должна форматироваться строка? Различные страны/регионы имеют совершенно разные форматы - разные символы валюты, независимо от того, существует ли символ до или после суммы, независимо от того, существует ли пробел между символом и суммой, если запятая или период используется для разделения десятичной, если запятые используются как разделитель тысяч, круглые скобки или знак минус для обозначения отрицательных значений и, возможно, больше того, о чем я не знаю.
Если приложение знает, что локаль/валюта это работать, общаться ценности как
"amount": "1234.56"
назад и вперед, и доверять приложение правильно форматировать сумму? (Также: следует ли избегать десятичного значения и значение, указанное в терминах наименьшей денежной единицы? Или следует указать основные и второстепенные единицы в разных свойствах?)
Или сервер должен предоставить исходное значение и форматированное значение?
"amount": "1234.56"
"displayAmount": "$1,234.56"
Нужно ли серверу предоставлять исходное значение и код валюты, а также формат приложения? «amount»: «1234.56» «currencyCode»: «USD» Я предполагаю, что любой используемый метод должен использоваться в обоих направлениях, передавая на сервер и с него.
Мне не удалось найти стандарт - есть ли у вас ответ или можете указать мне ресурс, который определяет это? Это похоже на общую проблему.
Связанные вопрос: https: //stackoverflow.com/questions/45222706/what-are-the-best-practices-passing-dollar-amounts-in-json –