在我的Rails应用程序中,我需要从CSV文件创建一个BigDecimal数组。这段代码
eval("[#<BigDecimal:7fabfeadef60,'0.6E1',9(18)>, #<BigDecimal:7fabfeadef10,'0.22995E5',9(18)>]")
产生以下错误消息
SyntaxError: (eval):1: syntax error, unexpected end-of-input, expecting ']'
...fabfeadef10,'0.22995E5',9(18)>]
... ^
我该怎么办?
答案 0 :(得分:1)
为了澄清Arthur和steenslag写的内容,你试图eval
不是Ruby代码的东西。
#<BigDecimal:...>
不是Ruby代码,它就是你在BigDecimal对象上调用inspect
时得到的结果,即文本表示意味着人类阅读以帮助调试,而不是Ruby可以读取的表示。< / p>
您不应将BigDecimal#inspect
的结果存储在CSV文件中;你应该存储to_s
的结果,它将是科学记数法中数字的字符串表示,例如0.22995E5
或to_s("F")
,它们将采用浮点表示法。这样,当您读取CSV文件时,可以使用
BigDecimal.new(str)
此处不应该使用eval
。每当你发现自己使用eval
时,这是一个大红旗,告诉你应该重新考虑你的程序设计。
答案 1 :(得分:0)
此字符串不是存储数组的最佳方式。检索信息有点笨拙,如下所示。看看Marshal
是否有转储和恢复对象。
require "bigdecimal"
str = "[#<BigDecimal:7fabfeadef60,'0.6E1',9(18)>, #<BigDecimal:7fabfeadef10,'0.22995E5',9(18)>]"
ar = str.split(">, #").map do |el|
value = el.split(",")[1][2..-2]
BigDecimal.new(value)
end
p ar # => [#<BigDecimal:2161280,'0.6E1',9(18)>, # =><BigDecimal:21610c8,'0.22995E5',9(18)>]
# Much easier: Marshal
dumped = Marshal.dump(ar)
p retrieved = Marshal.load(dumped) # => [#<BigDecimal:f3cfa0,'0.6E1',9(18)>, #<BigDecimal:f3cf00,'0.22995E5',9(18)>]