相关疑难解决方法(0)

在JSON中格式化货币值的标准是什么?

考虑到数据类型的各种怪癖和本地化,Web服务与应用程序之间传递货币价值的最佳方式是什么?某处有标准吗?

我的第一个想法是简单地使用数字类型.例如

"amount": 1234.56
Run Code Online (Sandbox Code Playgroud)

在使用浮点数据类型进行货币计算时,我已经看到很多关于缺乏精度和舍入误差的问题的论点 - 但是,我们只是传递值而不是计算,所以这无关紧要.

EventBrite的JSON货币规范指定如下:

{
"currency": "USD", 
"value": 432, 
"display": "$4.32"
}
Run Code Online (Sandbox Code Playgroud)

Bravo用于避免浮点值,但现在我们遇到另一个问题:我们可以容纳的最大数字是多少?

一条评论(我不知道它是否属实,但似乎是合理的)声称,由于数字实现在JSON中有所不同,因此您可以期待的最好的是32位有符号整数.32位有符号整数可以容纳的最大值是2147483647.如果我们表示次要单位中的值,那么是21,474,836.47美元.2100万美元似乎是一个巨大的数字,但是某些应用程序可能需要使用大于此值的值,这并不是不可思议的.对于1000个未成年单位成为主要单位的货币,或者货币价值低于美元的货币,问题会变得更严重.例如,突尼斯第纳尔分为1,000毫米.2147483647 milim,或2147483.647 TND是$ 1,124,492.04.在某些情况下,更有可能超过100万美元的价值.另一个例子:越南盾的子单位因通货膨胀而变得无用,所以让我们只使用主要单位.2147483647越南盾是98,526.55美元.我相信很多用例(银行存款,房地产价值等)远高于此.(EventBrite可能不必担心票价会那么高!)

如果我们通过将值作为字符串传递来避免该问题,那么字符串应该如何格式化?不同的国家/地区具有截然不同的格式 - 不同的货币符号,无论符号出现在金额之前还是之后,无论是否在符号和金额之间有空格,如果使用逗号或句点来分隔小数,如果逗号用作千位分隔符,括号或减号来表示负值,可能还有更多我不知道的值.

如果应用知道它正在使用的语言环境/货币,请传达类似的值

"amount": "1234.56"
Run Code Online (Sandbox Code Playgroud)

来回,并相信应用程序正确格式化金额?(另外:是否应避免使用小数值,以及以最小货币单位指定的值?或者主要和次要单位是否应列在不同的属性中?)

或者服务器应该提供原始值和格式化值?

"amount": "1234.56"
"displayAmount": "$1,234.56"
Run Code Online (Sandbox Code Playgroud)

或者服务器应该提供原始值和货币代码,并让应用程序格式化它?"amount":"1234.56""currencyCode":"USD"我假设使用的方法应该在两个方向上使用,与服务器之间进行传输.

我一直无法找到标准 - 您是否有答案,或者可以指向我定义此资源的资源?这似乎是一个普遍的问题.

json api-design currency

27
推荐指数
2
解决办法
2万
查看次数

如何在API中定义金额

我打算创建一个包含金额的API.我想知道最佳做法是什么,或者某人是否对某些格式有一些好的或坏的经历.

  • 我们应该传输基本单位还是小单位?(金额与amount_cents)
  • 我们应该将数字表示为整数/小数或字符串吗?

我见过以下两种可能性:

  1. 像这样的字符串发送金额:"5.85"(带基本单位的字符串)
  2. 以次要单位发送金额:585(表示次要单位金额的整数)

我要在这两者之间来回走动.所以我出去查看其他API使用的内容,并提出以下列表:

  • 条带:具有次要单位的整数
  • Braintree:带基本单位的字符串
  • Google电子钱包:包含基本单元的字符串
  • Paypal:带基本单位的字符串
  • 亚马逊支付:基本单位的字符串
  • 货币云:包含基本单位的字符串
  • 2checkout:带基本单位的字符串
  • Adyen:具有次要单位的整数
  • Dwolla:带基本单位的小数
  • GotoBilling:奇怪的启发式!"可以使用或不使用小数格式化数量.如果没有给出小数,则假设两(2)个小数位(1.00 = 100)"
  • GoCardless:带基本单位的字符串
  • Intuit:请求中带有基本单位的十进制数,带有响应中基本单位的字符串
  • Klarna:具有次要单位的整数
  • 万事达卡:具有次要单位的整数
  • Paynova:基本单位的字符串
  • Rogers Catalyst:带基本单元的字符串
  • WePay:带基本单位的字符串
  • Venmo:带基本单位的小数

因此,在18个采样的API中,4个使用次要单位,13个使用基本单位,1个使用难以理解的混合物.在13个使用基本单位的人中,10个是以引用的字符串形式传输它们,3个是不带引号的小数字(如果你看Intuit则实际为2个半).

我个人觉得不得不解析像"8.20"之类的字符串,因为如果你解析它会变成"8.19999999 ......"如果你错误地使用了浮点数.所以我倾向于只发送整数.但我不认为这是一个很好的论点,我发现通常API倾向于将基本单位作为字符串.

你对每种格式有什么好的论据吗?

currency

11
推荐指数
1
解决办法
1426
查看次数

标签 统计

currency ×2

api-design ×1

json ×1