13

単純に見えるが混乱する何かについて助けが必要です。必要に応じて計算される値と、選択リストから実際に利用できる値との間の形式の違いに対処するあいまいマッチング方法を作成しようとしています。

値(オプション行使価格)は、常に計​​算されたFloatlike85.0またはIntです。

配列には文字列形式の数値が含まれており、増分で表示されるか、小数に丸めて表示されるか(のような余分なゼロを含む)、5.50小数なしで表示されるか(のように85)は予測できません。例:

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

配列に表示される最も近い要素(数値)を返す単純な1行または2行のコードを作成する方法がわかりません。たとえば、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 に答える