评估字符串检查是否为整数

时间:2016-03-13 00:34:02

标签: ruby

我试图只输出此数组中的整数值。

perms=["12+2*4","2+2","-2+","12+34-","12-3/4"]
perms.each do |line|
    if (line.to_s =~ /^\d+(?:[+\/*-]\d+)*$/)
        puts "#{line}"
        if(!(eval(line).to_s=~ /\A\d+\z/))
            puts "#{line}=#{eval(line)}"
        end
    end

我得到了:

12+2*4
2+2
12-3/4

而不是我的预期:

12+2*4
12+2*4=20
2+2
2+2=4

(12-3 / 4不评估为整数,因此不应包含在此处)

1 个答案:

答案 0 :(得分:1)

如果=~运算符与正则表达式的字符串不匹配,则返回nil。如果找到匹配,则返回找到的匹配的偏移量。因此,您需要nilinteger。你的第二个if语句否定了匹配返回的内容。如果您否定nil,则会获得true但如果您否定一个整数,则会获得false。这意味着你的逻辑是倒退的。通过对nil添加检查,逻辑将按预期工作。

perms=["12+2*4","2+2","-2+","12+34-","12-3/4"]
perms.each do |line|
    if (line.to_s =~ /^\d+(?:[+\/*-]\d+)*$/)
        puts "#{line}"
        if(!(eval(line).to_s =~ /\A\d+\z/).nil?)
            puts "#{line}=#{eval(line)}"
        end
    end
end

有了这种理解,您甚至可以完全删除否定操作以获得相同的结果。与此相关,而不是eval(line)两次,你可以将它存储在变量中,尽管这更多是关于偏好。

perms=["12+2*4","2+2","-2+","12+34-","12-3/4"]
perms.each do |line|
    if (line.to_s =~ /^\d+(?:[+\/*-]\d+)*$/)
        puts "#{line}"
        result = eval(line)
        if(result.to_s =~ /\A\d+\z/)
            puts "#{line}=#{result}"
        end
    end
end