Неверный вывод при чтении десятичного значения из базы данных - PullRequest
0 голосов
/ 26 марта 2011

У меня странная проблема, которую я просто не могу понять.У меня есть валюты, хранящиеся в моей базе данных в виде десятичного числа.Я читаю из файла 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:

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 isпотому что значения вывода денег просто хранятся как отрицательные значения в файле CSV).

Когда я использую консоль, чтобы создать новую транзакцию и преобразовать строку в 1000 и сохранить ее, используя тот же метод, однако тогда это работает нормальнои значение сохраняется как 1000.0.

Кто-нибудь имеет какие-либо идеи, почему это будет?У меня не было бы, хотя это проблема FasterCSV, но я полагаю, это возможно, если номера CSV не читаются должным образом.

Спасибо за любую помощь,

Том

1 Ответ

2 голосов
/ 26 марта 2011

Вы просматривали необработанные данные 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)>
...