如何在 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 中定义金额的主要内容,如果未能解决你的问题,请参考以下文章