Rails 3.如何在模型中将数字显式舍入到小数点后两位?
可能重复:
Rails 3.如何以编辑forms显示两位小数?
我知道我可以使用sprintf来限制小数点后两位。
当我在表格中或表格中重新显示价格时,有时我会得到80而不是80.00。 从数据库中输入价格的那一刻起,只用两位小数存储价格会不会更好? 这样,无论何时显示,它总是会显示两位小数。 如果是这样,怎么样?
您应该尝试使用:decimal
类型的数据库字段,其中:scale
设置为2
将十进制列添加到新表中;
create_table :my_table do |t| t.decimal :my_column, :scale => 2 end
要将列添加到现有表;
add_column :my_table, :my_column, :decimal, :scale => 2
由于某些数据库没有精确默认值,因此精度很高。 比如postgresql:
add_column :my_table, my_column, precision: 30, scale: 2
您可以在显示数字时简单地使用x.round(2)
– 它将始终显示两位小数。 通常建议在后端数据库中将价格存储为整数,因为当您需要非常高的精度时,它们会得到更好的处理。 在这种情况下,你可以选择任何一种方式。
如果它是:float
或:decimal
,则Ruby中的80
和80.00
将是相同的( 80.0000
)。 后者没有“存储”更多小数位,并且尾随零只在视图中有意义。 你可以像你说的那样使用sprintf
,或者你可以使用Rails的方便的number_with_precision
帮助器:
<%= number_with_precision price, :precision => 2 %>
顺便提一下,这是关于这个主题的另一个问题 。 @Matthew Rudy对一件事是正确的:对于你应该使用的金钱栏:decimal
。
如果你真的致力于在你的视图中没有这个,你可以使用像Draper这样的东西将装饰器应用到你的属性中( number_with_precision
会将你的number_with_precision
调用移到一个新的Decorator类中),但它可能有点过分在这种情况下。
为此,我使用number_to_currency格式化程序。 由于我在美国,默认设置对我来说很好。
<% price = 45.9999 %> <%= number_to_currency(price)%> => $45.99
如果默认值不适合您,您也可以传入选项。 有关api.rubyonrails.org上可用选项的文档