Ruby on Rails - 货币:引起问题的逗号

时间:2010-01-25 19:16:23

标签: ruby-on-rails decimal numbers currency

看看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

4 个答案:

答案 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_savebefore_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:

http://github.com/clemens/delocalize

答案 3 :(得分:1)

在这里,您可以找到一个代码片段,它将使任何十进制列接受使用逗号作为小数分隔符的值:

http://gem-session.com/2010/03/how-to-use-the-comma-as-decimal-separator-in-rails-activerecord-columns-and-text-fields