在铁路中以分数存储价格

时间:2015-02-19 22:38:32

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

好的,我正在申请税收的Stripe费用。条纹的数量为美分,所以它会留下10015而不是100.15的数字。

在我的控制器中,我将号码发送到ActiveRecord为10015 / 100.0

当我检索它时,它会给我#<BigDecimal:7fca81f71130,'0.1243E3',18(27)>>

怎么回事?

我试过

rails g migration add_expense_to_user expense:integer

rails g migration add_expense_to_user expense:decimal

我添加了哪些迁移

add_column :user, :expense, :decimal, precision: 6, scale: 2

这是当前的设置。

如果值存储为10015/100

,如何存储/检索该值

3 个答案:

答案 0 :(得分:1)

访问数据时,您需要致电.to_f

在irb:

a = BigDecimal.new(5, 2)
a
=> #<BigDecimal:1ad7c98,'0.5E1',9(27)> 
a.to_f
=> 5.0

答案 1 :(得分:1)

BigDecimal只是Rails在DB中用于decimal类型的类型。 0.1243E3是科学记数法,是0.1243 x 10³的简称 - 即。 124.3

你可以通过在Ruby中使用.to_f方法从中获得常规浮点数,或者你可以将BigDecimal传递给其他Rails帮助程序,如number_to_currency(the_big_decimal)将生成{{1 }}

所以,换句话说,使用BigDecimal,你可能已经拥有了你在这个问题中所要求的内容。

答案 2 :(得分:0)

该值以任意精度存储在BigDecimal对象中。 &#34;常见&#34;但是,非整数值(即浮点数)的表示并不能提供这种精度。因此,BigDecimal提供了各种选项来将其值转换为其他类型。

您可以使用expense.to_f来获取BigDecimal值的浮点表示(从而在此过程中失去精度)。或者,如果您只想打印该值,可以使用to_s方法之一将值格式化为字符串:

expense.to_s
# => "124.3"

有关详细信息,请参阅BigDecimal documentation