将BigDecimal String转换为货币

时间:2016-09-19 10:25:50

标签: 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')

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

首先:为什么那些BigDecimal存储在数据库中的BigDecimal#inspect表示中?这是错误和坏的,应该修复。

虽然ruby API中似乎记录了格式,但可能无法保证在不同版本中保持这种格式。

我使用正则表达式来解析相关部分,只是为了确保在格式不匹配时我读了正确的内容并得到了正确的错误:

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