Rails如何存储带符号的小数以及如何为ruby中的数字解析字符串

时间:2014-05-07 08:18:37

标签: ruby database activerecord ruby-on-rails-4

我有两个问题

我有一个rails应用程序从rss feed获取有关货币的市场数据,这些数据以下列格式返回数据

a = ["31.25", "*33.00*", "*+1.75*", "*5.60%*", "33", "33"]
b = ["3.55", "*3.45*", "*-0.10*", "*-2.82%*", "3.5", "3.4"]

我需要将这些值作为十进制数据类型列存储在数据库中以用于精确目的,因为我正在处理钱。

第一个问题是:

我需要将上面的数组转换为以下格式,

 a = [31.25,33.00,1.75,5.60,33,33]

 b = [3.55,3.45,-0.10,2.82,3.5,3.4]

第二个问题是,

我应该使用什么rails命令为sqlite和postgresql数据库创建一个模型,其中一列具有存储带符号小数的功能,例如+1.75和-0.10

我试过

rails g model currency dollar:decimal

相反,当我在此模型中保存-0.10然后使用

查询它时
Currency.last.dollar

返回以下内容,而我只需要它返回-0.10

#<BigDecimal:ae244d8,'0.0',9(27)> 

2 个答案:

答案 0 :(得分:1)

第一个问题:

a.map{ |x| x.scan(/[\d\.-]+/)[0] }.map(&:to_f)

第二

Currency.first.dollar.to_f # => -0.1

或者this可能更合适:

add_column :currency, :dollar, :decimal, precision: 8, scale: 2

答案 1 :(得分:0)

使用regexps:

f = []
a.each do |i|
  f << i.match(/\-?[0-9]{1,2}(\.[0-9]{1,2})?/)[0].to_f
end

puts f

如果您有大量数据,请使用预先编译的regexp