2011-03-26 74 views
0

我有一個奇怪的問題,我無法弄清楚。我將貨幣存儲在我的數據庫中作爲小數。我正在讀取一個CSV文件並將該字符串轉換爲一個十進制數以存儲在數據庫中。這些值在檢查數據庫時看起來似乎沒有被正確存儲,大部分存儲都是正確的,但由於某種原因,存儲爲1和2299的值爲1000,因此存儲爲2,因此在999.99以上存在明顯的問題。從數據庫中讀取十進制值時輸出錯誤

我跑了數據庫遷移如下:

def self.up 
change_column(:transactions, :in, :decimal, :precision => 8, :scale => 2) 
change_column(:transactions, :out, :decimal, :precision => 8, :scale => 2) 
end 

這裏是用來存放從CSV文件值的代碼:

def create 

data = params[:dump][:file].read 

FasterCSV.parse(data, :headers => true) do |row| 

    transaction = Transaction.new 
    transaction.date = Date.strptime(row[0], "%d/%m/%Y") 
    transaction.transaction_type = row[4] 
    transaction.details = row[3] 

    if row[7].to_f < 0 
    transaction.out = row[7].to_d.abs 
    else 
    transaction.in = row[7].to_d.abs 
    end 
    transaction.save 

(的。ABS,是因爲錢值只是作爲負值存儲在CSV文件中)。

當我使用控制檯創建一個新的交易並轉換一個1000字符串並使用相同的方法存儲它但是,這工作正常,價值存儲爲1000.0。

有沒有人知道爲什麼會這樣?我不會有這雖然這是一個FasterCSV問題,但我想如果CSV數字沒有被正確讀取是可能的。

感謝您的幫助,

湯姆

回答

2

你有沒有看原始CSV數據:對於使用值> = 1000行?這聽起來像數據格式化每3位數的逗號,並且to_d方法將忽略在這種情況下第一個逗號後的所有內容。

>> '1,123.41'.to_d 
=> #<BigDecimal:10593e0a8,'0.1E1',9(18)> 

如果是這樣的問題,只是用gsub剝離逗號。

>> '1,123.41'.gsub(',','').to_d 
=> #<BigDecimal:105932398,'0.112341E4',18(18)> 
+0

完美的非常感謝你的建議。我沒有意識到,因爲當我在開放式辦公室打開CSV時,它刪除了所有格式,所以我只將它看作1000,甚至沒有考慮到可能有逗號。 – 2011-03-27 12:26:38