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

eas*_*ent 2 numbers currency ruby-on-rails decimal

看看SO,我看到使用RoR货币的首选方法是使用decimal(8,2)并使用number_to_currency()输出它们;

我可以从数据库中获取我的数据,但是我遇到了让它们进入的问题.

在我的更新操作中,我有以下行:

if @non_labor_expense.update_attributes(params[:non_labor_expense]) 
puts YAML::dump(params) 
Run Code Online (Sandbox Code Playgroud)

转移参数显示正确的值.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
Run Code Online (Sandbox Code Playgroud)

Guy*_*y C 8

我试过Daniel的before_validation想法,但我无法让它发挥作用.看来,当我到达before_validation时,输入已经被转换了.我使用的解决方案是覆盖列的方法,并在那里删除逗号:

def profit=(num)
  num.gsub!(',','') if num.is_a?(String)
  self[:profit] = num
end
Run Code Online (Sandbox Code Playgroud)


Dan*_*uis 6

它可能取决于您使用的DBMS,但据我所知,十进制字段不接受逗号(至少不作为分隔符;可能有一种方法让数据库接受逗号作为小数点而不是一段时间).您需要做的是从数字中删除逗号(before_save或者在a 或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
Run Code Online (Sandbox Code Playgroud)

然后number_to_currency在您想要显示使用逗号分隔的组和两个小数位格式化的费用金额时使用,如您所述:

<%
  non_labor_expense = ... # get value from your model
  puts number_to_currency(non_labor_expense, :precision => 2, :separator => ',')
%>
Run Code Online (Sandbox Code Playgroud)