【问题标题】:Get Price in Cents for Stripe获取 Stripe 的美分价格
【发布时间】:2012-09-14 19:51:27
【问题描述】:

我必须将一些价格的金额以美分发送到Stripe,以便对一张卡进行收费。在我的应用程序中,total_price 值是小数,即美元和美分。显然,我可以通过乘以 100 将其转换为美分:

total_price * 100

但结果仍然是小数,Stripe 给我一个“无效金额”错误。我知道舍入浮点数可能存在问题。我想知道在 Rails 中将total_price 转换为整数的最安全方法。我看到了一些关于金钱宝石的参考,但在这种情况下有必要这样做吗?

【问题讨论】:

  • total_price 真的是小数,还是浮点数?
  • 那么to_i 是正确的解决方案吗? @andrew - 老实说我不确定(就像我说的学习 RoR)我认为这是一个小数 - 它在数据库中。

标签: ruby-on-rails ruby stripe-payments


【解决方案1】:

Ruby 有几种可用于浮点的方法,具体取决于您的需要:

  • (cart.total_price * 100).to_i (discards all decimals)
  • (cart.total_price * 100).round # .round(numofdecimals)
  • (cart.total_price * 100).floor # 1.3 => 1
  • (cart.total_price * 100).ceil # 1.3 => 2
  • (cart.total_price * 100).to_r #to rationals, e.g. 2.5 => 5/2

我希望这会有所帮助。

【讨论】:

  • 我不认为to_r 在这里会有所帮助。
【解决方案2】:

实际上有一个非常简单的方法可以做到这一点,直接从十进制开始,而无需先转换为浮点数。给定:

decimal price = BigDecimal('100.00')

您可以使用 BigDecimal 的 fix() 和 frac() 方法取第一部分,乘以 100 并添加分数:

price_in_cents = ((decimal_price.fix * 100) + decimal_price.frac).to_i

另一种看似简单的可能性是使用字符串操作。您可以将小数转换为字符串,去掉句点,然后转换为整数,如:

price_in_cents = decimal_price.to_s.sub('.', '').to_i

但这里的问题是 decimal_price.to_s == '100.0' 而不是 '100.00'。如果分数中有非零数字,那么它们将在转换中保留,否则会丢失一个。因此,如果 decimal_price == 111.11 则上述字符串操作将返回预期结果。

【讨论】:

    猜你喜欢
    • 2021-04-10
    • 2021-04-03
    • 2020-10-19
    • 1970-01-01
    • 2021-03-17
    • 2015-08-29
    • 2015-04-21
    • 2016-02-06
    • 2021-09-23
    相关资源
    最近更新 更多