【问题标题】:Convert BigDecimal String to currency将 BigDecimal 字符串转换为货币
【发布时间】:2016-09-19 10:25:50
【问题描述】:

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

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

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

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

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

有什么想法吗?

【问题讨论】:

  • 您的数据库中有字符串 "#&lt;BigDecimal:7fabd9ba9618,'0.4173E2',18(18)&gt;"!?您确定这不是 BigDecimal 实例吗?
  • 我认为你只需要第二个参数。它也是一个字符串。所以需要通过split函数提取第二个参数
  • @Stefan - 是的有点奇怪 - 它是我数据库中缓存 JSON 数组的提取(最初来自 API 调用)。
  • API 是否损坏或您的 JSON 输出?

标签: ruby-on-rails ruby bigdecimal


【解决方案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

【讨论】:

  • 感谢优雅的解决方案。你是对的,我已经重新设计了架构,现在在数据库中存储为整洁的小数。 [自我注意-如果不容易;我可能做错了]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多