更改默认十进制数解析行为

时间:2017-11-14 05:46:04

标签: ruby-on-rails ruby decimal

我收到以下网络服务电话的回复:

response = "{\"price\":39.74000000000000198951966012828052043914794921875}"

然后我正在解析它:

json = JSON.parse(response, {:symboize_names: true})

结果是:

json = {price: 39.74}

然后我尝试从Rails控制台检查它是否因为JSON库而发生,但只是我得到了以下结果:

>> data = {:price => 39.74000000000000198951966012828052043914794921875}
{:price=>39.74}

因此它是Rails中的默认行为,我需要更改它(在应用程序级上)以始终将十进制数分析为BigDecimal而不是float

Ruby = 2.3.0

Rails = 4.2.4

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

解决方案确实是黑客攻击,但我找不到更好的

response = "{\"price\":39.74000000000000198951966012828052043914794921875}"
transformed_response = response.gsub(/\d+\.\d+/, '"\&"')
hash = JSON.parse(transformed_response , symboize_names: true})

结果hash将是

{ price: "39.74000000000000198951966012828052043914794921875" }

你可以用它来做这样的事情

hash.tap { |hash| hash[:price] = BigDecimal.new(hash[:price]) }