将 BigDecimal 字符串转换为货币

Convert BigDecimal String to currency

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

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

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

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

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

有什么想法吗?

首先:为什么那些 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