获取Cents for Stripe的价格

时间:2012-09-22 18:39:51

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

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

total_price * 100

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

2 个答案:

答案 0 :(得分:8)

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

我希望这会有所帮助。

答案 1 :(得分:-1)

实际上有一种非常简单的方法可以直接从小数点开始,而不必先转换为浮点数。给出:

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,那么上面的字符串操作将返回预期的结果。