13

我需要一些看似简单但让我困惑的事情的帮助。尝试编写一些模糊匹配方法来处理根据需要计算的值与从选择列表中实际可用的值之间的格式差异。

价值(期权行使价)始终是计算的 Float85.0或 Int。

该数组包含字符串形式的数字,无论是增量还是不可预测的数字是否会显示为一些小数(包括额外的零,如5.50)或无小数(如85),例如:

select_list = ["77.5", "80", "82.5", "85", "87.5", "90", "95", "100", "105"]

我不确定如何编写一两行简单的代码来返回最接近的匹配元素(按数值),因为它出现在数组中。例如,如果select_list.contains? 85.0返回 "85"

实际上,选择选项来自一个Watir::Webdriver browser.select_list(:id, "lstStrike0_1")HTML 对象,其可见文本(不是 HTML 值)是这些数字;也许有一种更直接的方式来调用 browser.select_list(:id, "lstStrike0_1").select X,而不必在 Watir 中弄清楚如何将所有这些选择转换为 Ruby 数组?

4

2 回答 2

22
xs = ["77.5", "80", "82.5", "85", "87.5", "90", "95", "100", "105"]
xs.min_by { |x| (x.to_f - 82.4).abs } 
#=> "82.5"
于 2012-07-13T19:31:23.550 回答
5

我不是 ruby​​ 编码器,所以这可能不是最好的方法

def select_closest(list, target)                               
    return (list.map {|x| [(x.to_f - target).abs, x]}).min[1]  
end                                                            

select_list = ["77.5", "80", "82.5", "85", "87.5", "90", "95", "100", "105"] 

puts select_closest(select_list, 81)  # yields 80
于 2012-07-13T19:21:39.823 回答