如何将整数转换为货币并显示正确的美分

How to convert an integer to currency and display the correct cents

如果 @service.amount 等于 28.95 美元:

<p><%= number_to_currency(@service.amount) %></p>

输出的是$2895.00,不是我上面写的。查找后没有找到解决方法。

@service.amount 是一个整数,因为 Stripe 只接受整数。

number_to_currency 不希望获得美分金额。它认为它是美元。您需要做的是将以美分为单位的金额转换为美元,然后将其发送到 number_to_currency 方法。

我不知道什么是对象 @service 但您应该能够创建另一个名为 amount_in_dollars:

的方法
def amount_in_dollars
  amount / 100.to_d
end

然后用数字转货币的方法:

<p><%= number_to_currency(@service.amount_in_dollars) %></p>

或者你可以直接在视图中分割它(但我更喜欢第一个变体)

<p><%= number_to_currency(@service.amount / 100.to_d) %></p>

Stripe 将值存储为美分。来自 docs:

Zero-decimal currencies

All API requests expect amounts to be provided in a currency’s smallest unit. For example, to charge 10 USD, provide an amount value of 1000 (i.e., 1000 cents).

我假设 API 响应 工作相似。

要获得正确的输出,您必须将 USD 值除以 100,例如:

<%= number_to_currency(@service.amount.fdiv(100)) %>

还有 Money gem 可能是更好的选择。它同时存储价值(以美分表示)及其货币,并带有格式:

require 'money'

money = Money.new(@service.amount, @service.currency)
#=> #<Money fractional:2895 currency:USD>

money.format
#=> ".95"