如何在 API 中定义金额

Posted

技术标签:

【中文标题】如何在 API 中定义金额【英文标题】:How to define money amounts in an API 【发布时间】:2015-06-03 04:20:27 【问题描述】:

我将创建一个包含金额的 API。我想知道最佳做法是什么,或者是否有人对某些格式有一些好的或不好的经验。

我们应该传输基本单位还是次要单位? (金额与金额_美分) 我们应该将数字表示为整数/小数还是字符串?

我见过以下两种可能性:

    以字符串形式发送金额,如下所示:“5.85”(带有基本单位的字符串) 以次要单位发送金额:585(表示次要单位金额的整数)

我在这两者之间来回走动。所以我去检查了其他 API 的使用情况,并提出了以下列表:

条纹:带次要单位的整数 Braintree:带基本单位的字符串 Google 电子钱包:带有基本单位的字符串 Paypal:带有基本单位的字符串 Amazon Payments:带有基本单位的字符串 货币云:带基本单位的字符串 2checkout:带基本单位的字符串 Adyen:带次要单位的整数 Dwolla:带基本单位的十进制 GotoBilling:奇怪的启发式方法! "金额的格式可以带或不带小数。如果没有给出小数,则假定有两 (2) 个小数位 (1.00 = 100)" GoCardless:带基本单位的字符串 直觉:请求中带有基本单位的十进制,响应中带有基本单位的字符串 Klarna:带次要单位的整数 万事达卡:带次要单位的整数 Paynova:带基本单位的字符串 罗杰斯催化剂:带基本单元的字符串 WePay:带基本单位的字符串 Venmo:带基本单位的十进制

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

我个人对解析“8.20”这样的字符串感到不舒服,因为如果你解析这个字符串,如果你错误地使用了浮点数,它就会变成“8.19999999...”。所以我倾向于只发送整数。但我不认为这是一个很好的论点,而且我发现 API 通常倾向于将基本单位作为字符串。

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

【问题讨论】:

哇,这是对各种 API 如何做到这一点的惊人总结! +1 研究工作!类似的问题也在 SO 上进行了辩论:***.com/questions/45222706/…***.com/questions/30249406/… 【参考方案1】:

整数会吃掉点,那就是少一个字节:D 整数会有一个 max_int,你有没有足够富有的人可能会溢出?

将货币字符串解析为浮点数的人无论如何都会将 int 转换为浮点数。

如果你发送二进制数据,整数会比字符串小得多,而且要走的路。如果您仍然发送 xml,您不妨将其定义为字符串(文件可能在发送之前已压缩?),尝试将其设为“货币”类型,而不是将其列为完整字符串。

【讨论】:

【参考方案2】:

哪种数据类型最好取决于您的使用情况。对于计算整数或双精度数会更快,跳过解析步骤。 如果您的目标是通过网络发送数据,那么最好使用字符串。

也就是说,任何功能都应该可以使用任何一种方法来实现。

【讨论】:

以上是关于如何在 API 中定义金额的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自适应贝宝 API 退还部分金额

Stripe API:您如何找到跨境转账到 Connect 账户的汇率和外币金额?

“立即捐赠”按钮的 Paypal 自定义金额

如何捕获部分金额

如何使用json.net自定义反序列化为对象

将金额转换为十万和千万