0

理解できない奇妙な問題があります。データベースに小数として通貨を保存しています。CSVファイルから読み取り、文字列を10進数に変換して、データベースに保存しています。データベースを調べたときに値が正しく保存されていないようです。ほとんどは正しく保存されていますが、何らかの理由で、私が持っている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ファイルの値を保存するために使用されるコードは次のとおりです。

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番号が正しく読み取られていない場合は、可能であると思います。

助けてくれてありがとう、

トム

4

1 に答える 1

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)>
于 2011-03-26T18:09:22.133 に答える