2016-09-19 100 views
1

我有将其从一个API调用获得的并且被存储在数据库中作为字符串纯字符串值:转换的BigDecimal字符串货币

#<BigDecimal:7fabd9ba9618,'0.4173E2',18(18)> 

这需要以某种方式转换成货币值。

我希望这样的工作,但它只是返回为零。

v = BigDecimal.new("#<BigDecimal:7fabd9ba9618,'0.4173E2',18(18)>") 
return v.to_s('F') 

任何想法?

+1

“#”'在你的数据库中!?你确定这不是['BigDecimal'](http://ruby-doc.org/stdlib/libdoc/bigdecimal/rdoc/BigDecimal.html)实例吗? – Stefan

+0

我认为你只需要第二个参数。也是一个字符串。所以你需要通过分割函数来提取第二个参数 –

+0

@Stefan - 有点奇怪 - 它是我数据库中缓存的JSON数组的摘录(最初来自API调用)。 – vectran

回答

1

第一:为什么那些BigDecimal的存储在BigDecimal#inspect表示在DB?这是错误的,应该修复。

尽管格式似乎在ruby API中有记录,但它可能不能保证在不同版本之间保持一致。

我会使用一个正则表达式解析出相关的部分,只是为了确保我读了正确的事情,并得到正确的错误时的格式不匹配:你有_String_`

match = big_decimal_as_string.match(/#<BigDecimal:[a-f0-9]+,'([0-9E\.]+)',\d+\(\d+\)>/) 
if match 
    BigDecimal.new(match[1]) 
else 
    raise "Could not parse #{big_decimal_as_string}" 
end 
+0

感谢您的优雅解决方案。你是对的,我已经重写了架构,现在在数据库中存储为小数点。 [注意自我 - 如果不容易;我可能做错了] – vectran