我必须向Stripe发送一些以美分为单位的价格金额,以便对卡进行收费。在我的应用程序中,该total_price
值是小数,即美元和美分。显然,我可以通过乘以 100 将其转换为美分:
total_price * 100
但结果仍然是小数,Stripe 给我一个“无效金额”错误。我知道舍入浮点数可能存在问题。我想知道total_price
在 Rails 中将 my 转换为整数的最安全方法。我已经看到一些关于金钱宝石的参考,但在这种情况下这是必要的吗?
我必须向Stripe发送一些以美分为单位的价格金额,以便对卡进行收费。在我的应用程序中,该total_price
值是小数,即美元和美分。显然,我可以通过乘以 100 将其转换为美分:
total_price * 100
但结果仍然是小数,Stripe 给我一个“无效金额”错误。我知道舍入浮点数可能存在问题。我想知道total_price
在 Rails 中将 my 转换为整数的最安全方法。我已经看到一些关于金钱宝石的参考,但在这种情况下这是必要的吗?
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
我希望这有帮助。
实际上有一种非常简单的方法可以做到这一点,直接从十进制开始,而无需先转换为浮点数。鉴于:
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 则上述字符串操作将返回预期结果。