如何检查Ruby中用户输入是否为整数?

时间:2019-02-19 02:26:09

标签: ruby user-input

我正在尝试循环播放,直到用户输入整数为止。用户输入字母时,以下代码应显示“数字思考”:

print "Think of a number "

while user_input = gets.to_i
  if user_input.is_a? Integer
    puts "your number is #{user_input}"
    break
  else
    print "Think of a number "
  end 
end 

当用户输入整数时,我的代码成功完成。但是,当用户输入字符串时,to_i方法将返回0,并且由于其是数字而不会执行else语句。

4 个答案:

答案 0 :(得分:4)

您的代码的主要问题是String#to_i方法是杂食性的。

"0".to_i #⇒ 0
"0.1".to_i #⇒ 0
"foo".to_i #⇒ 0

也就是说,您代码中的user_input总是整数

您可能想要的是仅接受数字(对于负数,可以接受前导减号。)接受字符子集的唯一简洁方法是正则表达式。

# chomp to strip out trailing carriage return
user_input = gets.chomp 

if user_input =~ /\A-?\d+\z/
  ...

上面的正则表达式表示除带有可选的前导减号的数字外没有其他内容。


或者甚至更好(归功于@Stefan)

if gets =~ /\A-?\d+\Z/

答案 1 :(得分:1)

如果您只想接受正数,则可以使用range

=query(southware!B3:AA,"SELECT * WHERE I matches '"&TEXTJOIN("|", 1, Top!B3:B)&"' and D='112'", 0)

答案 2 :(得分:0)

在下面一个已使用的Integer(gets.chomp) rescue ''

下方进行检查
print "Think of a number "

while user_input = Integer(gets.chomp) rescue ''
  if user_input.is_a? Integer
    puts "your number is #{user_input}"
    break
  else
    print "Think of a number "
  end
end

答案 3 :(得分:-1)

我遇到了类似的问题。我最终这样做:

if user_input.strip == user_input.to_i.to_s
  # More code here!
end

测试浮点数将是:

if user_input.strip == user_input.to_f.to_s
  # More code here!
end

解决了我的问题。看看是否有帮助。