2011-03-26 5 views
0

저는 이상한 문제가 있습니다. 내 데이터베이스에 10 진수로 저장된 통화가 있습니다. CSV 파일에서 읽고 데이터베이스에 저장할 문자열을 소수로 변환합니다. 데이터베이스를 검사 할 때 값이 올바르게 저장되지 않은 것으로 보입니다. 그러나 대부분의 값이 올바르게 저장되어 있지만 어떤 이유로 1000의 값이 1로 저장되고 2299가 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 파일에서 값을 저장하는 데 사용되는 코드입니다 :합니다 (.abs을

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 

입니다 밖으로 돈을 값이 단지이기 때문에 다음과 같이

나는 데이터베이스 마이그레이션을 실행 CSV 파일에 음수 값으로 저장).

콘솔을 사용하여 새 트랜잭션을 만들고 1000의 문자열을 변환 할 때 동일한 방법을 사용하여 저장하면이 작동이 잘되며 값은 1000.0으로 저장됩니다.

아무도 왜 이런 생각이 들지 않습니까? 이것이 FasterCSV 문제이지만 나는 가질 수 없지만 CSV 번호가 제대로 읽히지 않는다면 가능하다고 생각합니다. 어떤 도움

감사합니다,

답변

2

는 값> = 1000 행의 원시 CSV 데이터 봤어? 데이터가 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으로 보았고 거기에 쉼표가 있을지도 모른다고 생각하지 않았습니다. –