Rails 3.如何在模型中将数字显式舍入到两位小数?

leo*_*nel 16 ruby ruby-on-rails

可能重复:
Rails 3.如何以编辑形式显示两个小数位?

我知道我可以使用sprintf来限制小数点后两位.

当我在表格中或表格中重新显示价格时,有时候我会得到80而不是80.00.从价格输入数据库的那一刻起,只用两位小数存储价格会不会更好?这样,无论何时显示,它总是会显示两位小数.如果是这样,怎么样?

Ank*_*oni 36

您只需x.round(2)在显示数字时使用- 它将始终显示两位小数.通常建议在后端数据库中将价格存储为整数,因为当您需要非常高的精度时,它们会得到更好的处理.在这种情况下,你可以选择任何一种方式.

  • nope - 23.round(2)=> 23.0 (4认同)
  • 23.round(2)是== 23.0.23.0和23.00是一回事. (3认同)
  • @Websitescenes是的,它们是等价的,但是问题引用了"显示",所以看起来真正的愿望是小数点右边的一致数字位数. (2认同)

Jor*_*ing 21

如果它是一个:float或者:decimal,80并且80.00在Ruby中将是相同的东西(将如此80.0000).后者没有"存储"更多小数位,并且尾随零只在视图中有意义.你可以sprintf像你说的那样使用,或者你可以使用Rails的方便number_with_precision助手:

<%= number_with_precision price, :precision => 2 %>
Run Code Online (Sandbox Code Playgroud)

顺便提一下,这是关于这个主题的另一个问题.@Matthew Rudy对一件事是正确的:对于您应该使用的金钱栏目:decimal.

如果你真的致力于在你的视图中没有这个,你可以使用像Draper这样的东西将装饰器应用到你的属性中(这只会将你的number_with_precision调用移到一个新的Decorator类中),但它可能有点过分了.这个例子.

  • 你需要包含的帮助才能在模型中工作. (3认同)

Mat*_*udy 10

您应该尝试使用:decimal数据库字段的类型,:scale设置为2

将十进制列添加到新表中;

create_table :my_table do |t|
  t.decimal :my_column, :scale => 2
end
Run Code Online (Sandbox Code Playgroud)

要将列添加到现有表;

add_column :my_table, :my_column, :decimal, :scale => 2
Run Code Online (Sandbox Code Playgroud)

由于某些数据库没有精确默认值,因此精确定位是明智的.比如postgresql:

 add_column :my_table, my_column, precision: 30, scale: 2
Run Code Online (Sandbox Code Playgroud)


小智 7

为此,我使用number_to_currency格式化程序.由于我在美国,默认设置对我来说很好.

<% price = 45.9999 %>
<price><%= number_to_currency(price)%></price>
=> <price>$45.99</price>
Run Code Online (Sandbox Code Playgroud)

如果默认值不适合您,您也可以传入选项.有关api.rubyonrails.org上可用选项的文档