看看SO,我看到使用RoR的首选货币方式是使用decimal(8,2)并使用number_to_currency()输出它们;
我可以从数据库中获取我的数据,但是我遇到了让它们进入的问题。
在我的更新操作中,我有以下一行:
if @non_labor_expense.update_attributes(params[:non_labor_expense])
puts YAML::dump(params)
params转储显示正确的值。 xx,yyy.zz,但存储在数据库中的内容仅为xx.00
我需要做些什么才能考虑到可能有逗号而用户可能无法输入.zz(分数)。一些正则表达式和逗号?如果是.2与.20,你将如何处理小数?
必须有内置或至少更好的方式。
我的迁移(我不知道这是否有帮助):
class ChangeExpenseToDec < ActiveRecord::Migration
def self.up
change_column :non_labor_expenses, :amount, :decimal, :precision => 8, :scale => 2
end
def self.down
change_column :non_labor_expenses, :amount, :integer
end
end
答案 0 :(得分:8)
我尝试了Daniel的before_validation想法,但我无法让它发挥作用。看来,当我到达before_validation时,输入已经被转换了。我使用的解决方案是覆盖列的方法,并在那里删除逗号:
def profit=(num)
num.gsub!(',','') if num.is_a?(String)
self[:profit] = num
end
答案 1 :(得分:5)
这可能取决于您使用的DBMS,但据我所知,十进制字段不接受逗号(至少不作为分隔符;可能有一种方法让数据库接受逗号作为小数点而不是句号)。您需要做的是从您的号码中删除逗号(可能在before_save
或before_validation
过滤器中),然后在显示号码时,重新添加逗号。
before_validation :strip_commas_from_non_labor_expense
def strip_commas_from_non_labor_expense
self.non_labor_expense = self.non_labor_expense.to_s.gsub(/,/, '').to_f
end
如果您想要显示使用逗号分隔的组和两个小数位格式化的费用金额,请使用number_to_currency
,如上所述:
<%
non_labor_expense = ... # get value from your model
puts number_to_currency(non_labor_expense, :precision => 2, :separator => ',')
%>
答案 2 :(得分:3)
结帐delocalize gem:
答案 3 :(得分:1)
在这里,您可以找到一个代码片段,它将使任何十进制列接受使用逗号作为小数分隔符的值: