Rails将浮点值转换为整数

时间:2015-12-21 20:43:11

标签: ruby-on-rails ruby

我有一个名为value的属性的模型,它作为integer保存在数据库中。

我使用text_field在视图中输入数字,我也在其:before_save上执行一个方法,该方法获取值(类似于21.37)并使用money gem转换它只是美分。

然而,似乎在我甚至可以执行将其从float转换为整数的方法之前,它正被转换为某种整数并且小数正在丢失。

我通过在运行value的方法中输出before_save:并将其四舍五入到21

进行了测试

有谁知道为什么会发生这种情况,我没有对它进行任何其他更改。

2 个答案:

答案 0 :(得分:0)

我猜你在你的控制器中正在做类似Coupon.new(params)的事情,因为Rails知道Coupon的{​​{1}}应该是一个整数,它有助于调用{{1}在value为你提供封面,将21.37变成21。这是一个相当不优雅但有效的解决方案:

to_i

params[:value]之前执行此操作。

另一种选择是简单地假设你不关心小数点后第二位的任何东西(毕竟你要处理的是美分)。然后你可以简单地做params[:value] ~= /.*\.(\d+)/ params[:value] = params[:value].to_f * (10**$1.length) if $1

另外,您应该考虑在视图中使用Coupon.new(params)代替params[:value] = params[:value].to_f.round(2) * 100,这样您至少可以确定您获得了一个号码。像number_field之类的东西应该确保您的用户可以输入小数。

答案 1 :(得分:0)

我同意@kitkat似乎会在模型层中发生。您可能可以在“before_validation'之前实现转换为美分逻辑”。或者也许是优惠券的定制设定者。