从数据库读取十进制值时输出错误

时间:2011-03-26 17:57:35

标签: ruby-on-rails ruby-on-rails-3 bigdecimal fastercsv

我有一个奇怪的问题,我无法弄明白。我将货币存储在我的数据库中作为小数。我正在读取CSV文件并将字符串转换为小数以存储在数据库中。在检查数据库时,似乎没有正确存储这些值,大多数都是正确存储的,但由于某种原因,我所拥有的1000的值存储为1和2299存储为2,因此显然存在数字超过999.99的问题< / p>

我按如下方式运行了数据库迁移:

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是因为money out值只是作为负值存储在CSV文件中)。

当我使用控制台创建一个新事务并转换1000字符串并使用相同的方法存储它时,然后这工作正常,值存储为1000.0。

有人知道为什么会这样吗?我不会这是一个FasterCSV问题,但我想如果没有正确读取CSV编号就可以了。

感谢您的帮助,

汤姆

1 个答案:

答案 0 :(得分: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)>