我正在尝试循环,直到用户输入一个整数。当用户输入字母时,以下代码应打印"想一个数字":
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 语句,因为它是一个数字。
代码的主要问题是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/
如果您只想接受正数,则可以使用范围:
user_input = gets.chomp
if ('0'..'9').cover? user_input
让我们检查下面一个使用过的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
我遇到了类似的问题。我最终这样做了:
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
解决了我的问题。看看是否有帮助。