如何调整数据适配Highstock?JSON格式与BigDecimal数据问题
解决Highstock JSON数据格式与BigDecimal处理问题
咱们一步步来拆解并解决你遇到的两个核心问题:日期格式不匹配,以及BigDecimal处理后值变nil的问题。
1. 把日期字符串转换成Highstock要求的毫秒级时间戳
Highstock的时间轴数据必须是毫秒级Unix时间戳,而不是字符串格式的日期。你可以用Ruby的Time类轻松完成转换:
date_str = "2018-03-11" # 先解析日期,转成秒级时间戳后再乘1000得到毫秒级 timestamp = Time.parse(date_str).to_i * 1000 # 输出结果:1520726400000
这样就把你的日期字符串转换成了符合要求的数字格式。如果涉及时区问题,建议转成UTC时间戳避免偏差:
timestamp = Time.parse(date_str).utc.to_i * 1000
2. 正确处理BigDecimal数据,避免gsub后返回nil
你提到用a_string.gsub("/"",""")处理后值变nil,大概率是两个原因:一是你的变量本身不是字符串(比如是BigDecimal对象),直接调用gsub会报错;二是你的gsub语法写错了(引号转义有问题)。
正确的处理方式是先把BigDecimal转换成数字类型(Float或Integer),而不是直接做字符串替换:
require 'bigdecimal' # 示例:处理BigDecimal类型数据 big_decimal_val = BigDecimal("0.0003") # 转成Float(如果不需要极高精度) float_val = big_decimal_val.to_f # 如果是带引号的字符串(比如从JSON中读取的),先清掉引号再转数字 str_with_quotes = "\"0.0003\"" clean_val = str_with_quotes.gsub('"', '').to_f
之前的gsub("/"",""")语法是错误的,正确的去掉双引号应该写成gsub('"', '')或者gsub(/"/, ''),错误的语法会导致方法执行失败,这也是你得到nil的关键原因。
完整的转换示例
把你的原始数据转换成Highstock需要的格式,可以写一个简单的转换方法:
require 'bigdecimal' def format_for_highstock(raw_entry) date_str, open_str, high_str, low_str, close_str, volume = raw_entry # 转换日期为毫秒时间戳 timestamp = Time.parse(date_str).to_i * 1000 # 转换各类数值 open = BigDecimal(open_str).to_f high = BigDecimal(high_str).to_f low = BigDecimal(low_str).to_f close = BigDecimal(close_str).to_f volume = volume.to_i [timestamp, open, high, low, close, volume] end # 你的原始数据 raw_data = [["2018-03-11","0.0003","0.5","0.0003","0.5",5]] # 转换后的数据 highstock_ready_data = [format_for_highstock(raw_data.first)] # 输出结果:[[1520726400000, 0.0003, 0.5, 0.0003, 0.5, 5]]
额外提示
如果你的数据精度要求极高,不建议用to_f(会丢失部分精度),可以考虑保留BigDecimal的字符串形式后转成Highstock支持的数字格式,但通常Float已经能满足大部分场景需求。
内容的提问来源于stack exchange,提问作者Ryu Nishida
相关产品推荐
相关产品推荐

