2010-01-25 61 views
2

看着SO,我發現使用RoR的貨幣的首選方式是使用decimal(8,2)並使用number_to_currency()輸出它們;Ruby on Rails - 貨幣:導致問題的逗號

我能得到我的號碼了DB的,但我對讓他們在遇到問題

在我的更新動作我有以下行:

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

1.2和0.20是相同的numbe r,所以不管你如何存儲它,只要你如何顯示它。 – 2010-01-25 19:19:04

+0

沒錯。第一個問題是,我忘記了逗號後的數據。你說過一次,我解決了這個問題,.2和.20會解決它在數據庫中的存儲方式嗎? – easement 2010-01-25 19:24:32

+0

查看我的回答;基本上,您將該數字作爲直接(未格式化)的十進制數存儲在數據庫中,然後在需要顯示時按照需要進行格式化。 – 2010-01-25 19:28:54

回答

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 => ',') 
%> 
+0

我試過你的before_validation和模型中的函數,我放YAML :: dump(self.amount)但金額已被截斷。 我得到以下錯誤:私有方法'gsub!'要求#當我將您的代碼更改爲:self.amount.gsub!('/,/','') 任何想法? – easement 2010-01-25 20:21:41

+0

如果我做self.amount.to_s.gsub!('/,/',''),那麼gsub!工作,但在我進行調用之前進行轉儲,看起來好像該值已被截斷。有任何想法嗎? – easement 2010-01-25 20:34:15

+0

對不起,我更新了我的答案。在正則表達式周圍不需要引號(我今天處於PHP模式,heh),應該使用'gsub'而不是'gsub!',因爲如果不進行替換,後者將用'nil'替換字符串。另外,我在末尾添加了'to_f',將它放回到一個浮點數中。 – 2010-01-25 20:35:44

7

我想丹尼爾的before_validation想法,我只是無法得到它的工作。看來,到了before_validation時,輸入已經被轉換了。我去的解決方案是覆蓋列的方法,並去掉了逗號有:

def profit=(num) 
    num.gsub!(',','') if num.is_a?(String) 
    self[:profit] = num 
end 
+0

這對我很好,謝謝。 – weston 2011-07-01 04:01:59

+0

工程,但亨寧的建議是DRY'er,如果你打算轉換,。在應用程序中的幾個輸入。 – Magne 2011-10-06 15:57:29

+0

謝謝,很好的解決方案! – ExiRe 2012-07-16 10:19:41