我需要在ruby中比较2个哈希,其中一个哈希包含带引号的字符串中的数值,这使得它成为一个字符串。考虑以下2个哈希:
hash1 = {"A"=>"0", "B"=>"1", "SVHTID"=>"VH", "D"=>"0", "E"=>"19930730", "F"=>"TEST - DEPOSIT", "G"=>"2.25000000"}
hash2 = {"a"=>"0", "b"=>1, "c"=>"VH", "d"=>0,"e"=>19930730, "f"=>"TEST - DEPOSIT", "g"=>2.25}
现在我写的代码如下:
hash2 = Hash[hash2.map {|key, value| [key.upcase, value] }]
hash1.each{|k,v| hash1[k] = hash1[k].to_i if hash1[k].match(/-?\d+(?:\.\d+)?/)}
hash1.keys.select { |key| hash1[key] != hash2[key] }.each { |key|
puts "expected #{key} => #{hash1[key]}, but found #{key} => #{hash2[key]}"
}
它的作用是将float值转换为整数并且原始值丢失。
我想要的是,当比较上面的2个哈希时,输出应该只包含G作为不匹配的类型,并且应该打印以下内容:
Expected: G=>2.25000000 but found G=>2.25
答案 0 :(得分:0)
# normalization
h1, h2 = [hash1, hash2].map do |h|
h.map do |k, v|
[k.to_s.downcase, v.to_s.to_i.to_s == v.to_s ? v.to_i : v]
end.to_h
end
现在我们准备进行比较:
h1.reject { |k, v| h2[k].nil? || h2[k] == v }
#⇒ { "g" => "2.25000000" }
可以根据需要打印,格式化等。