Ruby on rails 将BigDecimal字符串转换为货币

Ruby on rails 将BigDecimal字符串转换为货币,ruby-on-rails,ruby,bigdecimal,Ruby On Rails,Ruby,Bigdecimal,我有一个纯字符串值,它是从API调用中获得的,并作为字符串存储在数据库中: #<BigDecimal:7fabd9ba9618,'0.4173E2',18(18)> # 这需要以某种方式转换为货币价值 我希望这样的东西能起作用,但它只是返回为零 v = BigDecimal.new("#<BigDecimal:7fabd9ba9618,'0.4173E2',18(18)>") return v.to_s('F') v=BigDecimal.new(“#”) 将v.返

我有一个纯字符串值,它是从API调用中获得的,并作为字符串存储在数据库中:

#<BigDecimal:7fabd9ba9618,'0.4173E2',18(18)>
#
这需要以某种方式转换为货币价值

我希望这样的东西能起作用,但它只是返回为零

v = BigDecimal.new("#<BigDecimal:7fabd9ba9618,'0.4173E2',18(18)>")
return v.to_s('F')
v=BigDecimal.new(“#”)
将v.返回给_s('F')

有什么想法吗?

首先:为什么那些
BigDecimal
存储在数据库中的
BigDecimal\inspect
表示中?这是错误和不好的,应该纠正

虽然ruby API中似乎记录了该格式,但它可能无法保证跨版本的持久性

我会使用一个regexp来解析相关部分,以确保在格式不匹配时读取正确的内容并得到正确的错误:

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
match=big_decimal_as_string.match(/#/)
如果匹配
BigDecimal.new(匹配[1])
其他的
raise“无法将#{big_decimal_作为_string}解析”
结束

您的数据库中有字符串
“#”
!?你确定这不是一个实例吗?我想你只需要第二个参数。它也是一根弦。因此,您需要通过split提取第二个参数function@Stefan-是的,有点奇怪-这是我数据库中缓存的JSON数组的摘录(最初来自API调用)。是API损坏了还是JSON输出?感谢您提供的优雅解决方案。你是对的,我修改了架构,现在在数据库中存储整齐的小数。[自我提醒-如果不容易,我可能做错了]