【发布时间】:2015-07-26 18:46:18
【问题描述】:
考虑到数据类型和本地化的各种怪癖,Web 服务与应用程序之间传递货币价值的最佳方式是什么?某处有标准吗?
我的第一个想法是简单地使用数字类型。例如
"amount": 1234.56
我看到很多关于使用浮点数据类型进行货币计算时缺乏精度和舍入误差的争论——但是,我们只是传输值,而不是计算,所以这无关紧要。
EventBrite's JSON currency specifications 指定如下内容:
{
"currency": "USD",
"value": 432,
"display": "$4.32"
}
避免使用浮点值真是太棒了,但现在我们遇到了另一个问题:我们可以容纳的最大数字是多少?
One comment(我不知道这是否属实,但似乎合理)声称,由于 JSON 中的数字实现有所不同,因此您可以期望的最好的是 32 位有符号整数。 32 位有符号整数可以容纳的最大值是 2147483647。如果我们用次要单位表示值,那就是 $21,474,836.47。 2100 万美元似乎是一个巨大的数字,但某些应用程序可能需要以更大的价值工作并不是不可想象的。对于 1,000 个次要单位构成主要单位的货币,或者该货币的价值低于美元的货币,问题会变得更糟。例如,突尼斯第纳尔分为 1,000 milim。 2147483647 milim 或 2147483.647 TND 为 1,124,492.04 美元。在某些情况下,更有可能使用超过 100 万美元的价值。另一个例子:越南盾的子单位因通货膨胀而变得无用,所以我们只使用主要单位。 2147483647 越南盾为 98,526.55 美元。我敢肯定,许多用例(银行余额、房地产价值等)远高于此。 (不过,EventBrite 可能不必担心票价那么高!)
如果我们通过将值作为字符串传递来避免这个问题,那么字符串应该如何格式化?不同的国家/地区具有截然不同的格式——不同的货币符号,符号出现在金额之前还是之后,符号和金额之间是否有空格,是否使用逗号或句点分隔小数点,如果逗号用作千位分隔符、括号或减号以表示负值,可能还有更多我不知道的值。
应用是否应该知道它正在使用的语言环境/货币,传达诸如
之类的值"amount": "1234.56"
来回,并相信应用程序正确格式化金额? (另外:应该避免使用十进制值,并以最小货币单位指定值?还是应该在不同的属性中列出主要和次要单位?)
或者服务器应该提供原始值和格式化值?
"amount": "1234.56"
"displayAmount": "$1,234.56"
或者服务器应该提供原始值和货币代码,并让应用程序格式化它? “金额”:“1234.56” “货币代码”:“美元” 我认为无论使用哪种方法都应该双向使用,向服务器传输和从服务器传输。
我一直找不到标准——你有答案吗,或者可以指出一个定义这个的资源?这似乎是一个常见问题。
【问题讨论】:
标签: json currency api-design