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

标签 json currency api-design

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

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

"amount": 1234.56

在使用 float 据类型进行货币计算时,我看到了很多关于缺乏精度和舍入误差问题的争论——但是,我们只是传输值,而不是计算,所以这无关紧要。

EventBrite's JSON currency specifications指定如下内容:

{
"currency": "USD", 
"value": 432, 
"display": "$4.32"
}

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

One comment (我不知道这是否属实,但似乎合理)声称,由于 JSON 中的数字实现有所不同,因此您可以期望的最好的是 32 位有符号整数。 32 位有符号整数可以容纳的最大值是 2147483647。如果我们用次要单位表示值,那就是 $21,474,836.47。 2100 万美元似乎是一个巨大的数字,但某些应用程序可能需要以更大的值(value)工作并非不可想象。对于 1,000 个次要单位构成主要单位的货币,或者该货币的值(value)低于美元的货币,问题会变得更糟。例如,突尼斯第纳尔分为 1,000 milim。 2147483647 milim 或 2147483.647 TND 为 1,124,492.04 美元。在某些情况下,更有可能使用超过 100 万美元的值(value)。另一个例子:越南盾的子单位因通货膨胀而变得无用,所以我们只使用主要单位。 2147483647 越南盾为 98,526.55 美元。我敢肯定,许多用例(银行余额、房地产值(value)等)远高于此。 (不过,EventBrite 可能不必担心票价那么高!)

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

应用是否应该知道它正在使用的语言环境/货币,传达诸如

之类的值
"amount": "1234.56"

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

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

"amount": "1234.56"
"displayAmount": "$1,234.56"

或者服务器应该提供原始值和货币代码,并让应用程序格式化它? “金额”:“1234.56” “货币代码”:“美元” 我认为无论使用哪种方法都应该双向使用,向服务器传输和从服务器传输。

我一直找不到标准——你有答案吗,或者可以指出一个定义这个的资源?这似乎是一个常见问题。

最佳答案

我不知道这是否是最好的解决方案,但我现在正在尝试将值作为除小数点外未格式化的字符串传递,如下所示:

"amount": "1234.56"

应用程序可以轻松解析它(并将其转换为 double、BigDecimal、int 或应用程序开发人员认为最适合浮点运算的任何方法)。该应用程序将负责根据区域设置和货币格式化显示值。

这种格式可以容纳其他货币值,无论是高度膨胀的大数字、小数点后三位数字、根本没有小数值的数字等等。

当然,这假设应用已经知道使用的区域设置和货币(来自另一个调用、应用设置或本地设备值)。如果需要在每次调用时指定这些,另一种选择是:

"amount": "1234.56",
"currency": "USD",
"locale": "en_US"

我很想将这些汇总到一个 JSON 对象中,但一个 JSON 提要可能有多个用于不同目的的金额,然后只需要指定一次货币设置。当然,如果列出的每个数量可能有所不同,那么最好将它们封装在一起,如下所示:

{
"amount": "1234.56",
"currency": "USD",
"locale": "en_US"
}

另一种有争议的方法是让服务器提供原始金额和格式化金额。 (如果是这样,我建议将其封装为一个对象,而不是在一个提要中拥有多个定义相同概念的属性):

{
"displayAmount":"$1,234.56",
"calculationAmount":"1234.56"
}

在这里,更多的工作被卸载到服务器上。它还确保了不同平台和应用程序在数字显示方式上的一致性,同时仍为条件测试等提供易于解析的值。

但是,它确实留下了一个问题——如果应用程序需要执行计算然后将结果显示给用户怎么办?它仍然需要格式化数字以进行显示。不妨使用此答案顶部的第一个示例,并让应用程序控制格式。

这些是我的想法,至少。我一直无法在该领域找到任何可靠的最佳实践或研究,因此我欢迎更好的解决方案或我没有指出的潜在陷阱。

关于json - 在 JSON 中格式化货币值的标准是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30249406/

相关文章:

java - 创建 JSON 格式的键值对字符串

javascript - Nodejs 中的 JSON 新手遇到一些错误

xml - 在保持默认 JSON 的同时强制 xml 在某些 Web API Controller 上返回

.net - 如何始终克服损失的几分钱?

java - 为什么 AtomicBoolean 不能替代 Boolean?

java - 在Java中使用apache commons vfs2访问后删除zip文件

python - 显示金额 - Python

Java Money - 特定日期的货币兑换率

rest - REST 嵌套资源的最佳实践是什么?

javascript - 我如何使用 JavaScript 创建此 API 并分解方法