我正在尝试循环播放,直到用户输入整数为止。用户输入字母时,以下代码应显示“数字思考”:
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语句。
答案 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
解决了我的问题。看看是否有帮助。