Принимая во внимание различные причуды типов данных и локализацию, каков наилучший способ для веб-службы передавать денежные значения в приложения и из них? Есть ли где-нибудь стандарт?
Моя первая мысль состояла в том, чтобы просто использовать тип номера. Например
"amount": 1234.56
Я видел много аргументов в отношении проблем с отсутствием точности и ошибок округления при использовании типов данных с плавающей точкой для денежных расчетов - однако мы просто передаем значение, а не вычисляем, так что это не имеет значения.
Спецификации валюты EventBrite JSON укажите что-то вроде этого:
{
"currency": "USD",
"value": 432,
"display": "$4.32"
}
Браво, чтобы избежать значений с плавающей запятой, но теперь мы сталкиваемся с другой проблемой: какое наибольшее число мы можем удерживать?
Один комментарий (я не знаю, действительно ли его правда, но кажется разумным) утверждает, что, поскольку модификации номеров различаются в 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"
Или должен ли сервер предоставить исходное значение и код валюты, и пусть приложение форматирует его? "сумма": "1234,56" "currencyCode": "USD" Я предполагаю, что какой бы метод использовался, он должен использоваться в обоих направлениях, передавая на сервер и с него.
Я не смог найти стандарт - есть ли у вас ответ или может указать мне ресурс, который определяет это? Это похоже на общую проблему.