我将创建一个包含金额的 API。我想知道最佳实践是什么,或者是否有人对某些格式有好的或坏的体验。
- 我们应该传输基本单位还是次要单位? (金额与 amount_cents)
- 我们应该将数字表示为整数/小数还是字符串?
我看到了以下两种可能性:
- 以字符串形式发送金额,如下所示:“5.85”(带有基本单位的字符串)
- 以次要单位发送金额:585(以次要单位表示金额的整数)
我在这两者之间来回走动。因此,我出去检查了其他 API 使用的内容,并得出了以下列表:
- Stripe:带小单位的整数
- Braintree:带有基本单位的字符串
- Google 电子钱包:带基本单位的字符串
- Paypal:带有基本单位的字符串
- Amazon Payments:带有基本单位的字符串
- 货币云:带有基本单位的字符串
- 2checkout:带有基本单位的字符串
- Adyen:带有小单位的整数
- Dwolla:带有基本单位的十进制
- GotoBilling:奇怪的启发式! “金额的格式可以包含或不包含小数。如果没有给出小数,则假定为两 (2) 位小数 (1.00 = 100)”
- GoCardless:带有基本单位的字符串
- Intuit:请求中带有基本单位的十进制,响应中带有基本单位的字符串
- Klarna:带有小单位的整数
- MasterCard:带有小单位的整数
- Paynova:带有基本单位的字符串
- Rogers Catalyst:带有基本单位的字符串
- WePay:带有基本单位的字符串
- Venmo:带基本单位的十进制
因此,在 18 个采样 API 中,4 个使用次要单位,13 个使用基本单位,1 个使用难以理解的混合单位。在使用基本单位的 13 个用户中,有 10 个将它们作为带引号的字符串传输,3 个作为不带引号的小数传输(如果你查看 Intuit,实际上是 2 个半)。
我个人对解析像“8.20”这样的字符串感到不舒服,因为如果你解析这个字符串,如果你错误地使用了 float ,它就会变成“8.19999999...”。所以我倾向于只发送整数。但我不认为这是一个很好的论点,而且我发现 API 通常倾向于使用基本单位作为字符串。
对于每种格式,你有什么好的论据吗?
最佳答案
整数会吃掉点,那就少了一个字节:D 整数将有一个 max_int,你有足够富有的人可能会溢出吗?
将货币字符串解析为 float 的人无论如何都会将 int 转换为 float 。
如果发送二进制数据,整数将比字符串小得多。如果您无论如何发送 xml,您也可以将其定义为一个字符串(该文件可能在发送之前被压缩,对吧?),尝试将其设置为“货币”类型,而不是将其列为完整字符串。
关于currency - 如何在 API 中定义金额,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29341337/