Ruby 只接受数字输入

Ruby 只接受数字输入,ruby,Ruby,我想强制用户只从控制台输入数值。下面是我的一段代码 puts "Enter numeric value: " result = gets.chomp if result.to_i.is_a? Numeric puts "Valid input" else puts "Invalid input." end 即使输入字符串值,它也会打印有效的输入。原因是每个字符串在Ruby中都有一些等价的数值。是否有人可以帮助我正确修复该条件,以便当用户输入非数值时,脚本提示无效输入。将任何字符串转换

我想强制用户只从控制台输入数值。下面是我的一段代码

puts "Enter numeric value: "
result = gets.chomp

if result.to_i.is_a? Numeric
  puts "Valid input"
else
  puts "Invalid input."
end
即使输入字符串值,它也会打印有效的输入。原因是每个字符串在Ruby中都有一些等价的数值。是否有人可以帮助我正确修复该条件,以便当用户输入非数值时,脚本提示无效输入。

将任何字符串转换为整数,即使它不应该:

"asdf".to_i
返回0

您要做的是:

puts "Enter numeric value: "
result = gets.chomp

begin
  result = Integer(result)
  puts "Valid input"
rescue ArgumentError, TypeError
  puts "Invalid input."    
  # handle error, maybe call `exit`? 
end

如果字符串不能转换为整数,Integersome\u非数值\u字符串将引发异常,而Stringto\u i在这些情况下给出0,这就是为什么result.to\u i.is\u a?数值总是正确的。

尝试正则表达式,如下所示:

puts "Enter numeric value: "
result = gets

if result =~ /^-?[0-9]+$/
    puts "Valid input"
else
    puts "Invalid input."
end
上面的示例只允许数字[0..9]。
如果您不仅要读取整数,还可以允许使用点:^-?[0-9]+$/。阅读有关Ruby中regexp的更多信息:

如果您是指整数加数字,那么:

puts "Enter numeric value: "
result = gets.chomp
case result
when /\D/, ""
  puts "Invalid input"
else
  puts "Valid input."
end

它还处理空字符串,to_i会将其转换为0,这可能是您不想要的。

感谢您的即时响应。我理解那部分。我需要帮助在if语句中使用正确的条件?您应该使用它来替换整个条件语句。当然,如果@cheniel的示例难以理解,您也可以在if语句中使用正则表达式。检查下面的答案,两种方法都很有效。@cheniel-谢谢你的示例和解释。我现在正在使用正则表达式。但是作为一个新手,了解多个解决方案是很好的。对我来说,这个例子的价值在于它使用了一个异常。任何来自Python的人都应该对这个实现感到自在。numeric这个词对吗?1.3.什么样的?Numeric=>true。对于快速发布答案并要求您选择答案的成员的请求,请不要在意。快速选择可能会阻碍其他答案,imo对那些仍在研究答案的人是不尊重的。如果一两天后你还没有选择答案,你可能会得到一个温和的提示,如果你发现其中任何一个答案对你有帮助的话,你可以选择一个答案。这没什么错。关键是不要急于选择,只是不要忘记。如果您不知道,作为提问者,您可以向上或向下投票答案,并且始终可以更改您对最喜欢答案的选择。如果您觉得有帮助,请随时将其标记为答案。请记住,结果仍然是条件后的字符串。不确定您想要什么行为,但您可能仍然需要使用Integerresult或result.to__i将其转换。他可以在打印消息后键入result=result.to_i,对吗,兄弟?或者甚至是Integerresult,因为如果它已经是有效的整数输入,则不会引发任何异常。是。在此检查之后,result.to_i或Integerresult都可以工作。编辑而不是[0-9]使用\d。它在视觉上没有那么吵闹。