如何在API中定义金额

时间:2015-03-30 08:15:15

标签: currency

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

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

我已经看到了以下两种可能性:

  1. 将金额作为字符串发送,如下所示:" 5.85" (带基本单位的字符串)
  2. 以次要单位发送金额:585(表示未成年单位金额的整数)
  3. 我在这两者之间来回走动。所以我出去查看其他API使用的内容,并提出以下列表:

    • 条纹:具有次要单位的整数
    • Braintree:带基本单位的字符串
    • Google电子钱包:带基本单元的字符串
    • Paypal:带基本单位的字符串
    • 亚马逊付款:包含基本单位的字符串
    • 货币云:包含基本单位的字符串
    • 2checkout:带基本单位的字符串
    • Adyen:具有次要单位的整数
    • Dwolla:带基本单位的小数
    • GotoBilling:奇怪的启发式! "金额可以使用或不使用小数格式化。如果没有给出小数,则假设两(2)个小数位(1.00 = 100)"
    • GoCardless:带基本单位的字符串
    • Intuit:请求中带有基本单位的十进制数,带有响应中基本单位的字符串
    • Klarna:具有次要单位的整数
    • 万事达卡:具有次要单位的整数
    • Paynova:带基本单位的字符串
    • Rogers Catalyst:带基本单位的字符串
    • WePay:带基本单位的字符串
    • Venmo:带基本单位的小数

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

    我个人觉得不得不解析像" 8.20"这样的字符串,因为如果你解析它就会变成" 8.19999999 ..."如果你错误地使用浮动。所以我只倾向于发送整数。但我不认为这是一个很好的论据,我发现通常API倾向于将基本单位作为字符串。

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

2 个答案:

答案 0 :(得分:1)

整数会占用点,这个字节少一个:D整数将有一个max_int,你有没有足够丰富的人可能会溢出吗?

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

如果发送二进制数据,整数将远小于字符串和方法。如果您仍然发送xml,您也可以将其定义为一个字符串(该文件可能在发送之前被压缩了吗?),尝试使其成为"货币"键入而不是将其列为完整字符串。

答案 1 :(得分:0)

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

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