我试图让用户输入一个正整数 (>=1)。如果用户输入负整数或 0,程序会注意到并说您没有输入有效整数,请重试。到目前为止,我的程序一直有效,直到我尝试输入一个字符串。输入字符串后我的程序中断。有人知道如何解决这个问题吗?
我试过 elsif !barsofsoap.match (/\A[-+]?[0-9]*.?[0-9]+\Z/) puts "You didn't enter an integer, please put a positive integer",但是没用
loop do
puts "How many soaps are you looking to purchase? (Please put an integer)"
x = gets.chomp
barsofsoap = Integer(x) rescue false
if barsofsoap >= 1
break
else
puts "You didn't put an integer, please put an integer and try again."
end
end
我希望程序不会在用户输入字符串时中断。
最佳答案
您当前代码失败的原因是因为您使用 false
作为救援值。您无法比较 false >= 1
。贴近您的原始代码,您可以将比较包装到 begin
/end
block 中。
loop do
puts "How many soaps are you looking to purchase? (Please put an integer)"
x = gets.chomp
begin
barsofsoap = Integer(x)
if barsofsoap >= 1
break
end
rescue ArgumentError => _error
puts "You didn't put an integer, please put an integer and try again."
end
end
或者简化代码:
loop do
puts "How many soaps are you looking to purchase? (Please put an integer)"
break if (barsofsoap = gets.to_i).positive?
puts "Invalid input. Provide a positive integer."
end
上面的代码没有检测输入是字符串还是整数。通过将 Integer(x)
替换为 x.to_i
,如果无效,它将简单地返回 0
。由于您希望用户提供一个正整数,因此它仍然要求他们提供一个新整数。
nil.to_i #=> 0
''.to_i #=> 0
'asdf'.to_i #=> 0
'12.34'.to_i #=> 12
如上所示,字符串 '12.34'
将生成值 12
。根据您的要求,您可能不想使用此值,而是将其标记为无效输入。在这种情况下,您可以使用正则表达式来检查提供的输入。
loop do
puts "How many soaps are you looking to purchase? (Please put an integer)"
input = gets
break barsofsoap = input.to_i if input.match?(/\A[1-9]\d*\Z/)
puts "Invalid input. Provide a positive integer."
end
正则表达式 /\A[1-9]\d*\Z/
将匹配以下内容:
\A
匹配字符串的开头。[1-9]
匹配其中一个数字1-9
。\d*
匹配零个或多个数字0-9
。\Z
匹配字符串的结尾。如果字符串以换行符结尾,它就在换行符之前匹配。
关于ruby - 检查 ruby 中的整数是否为正,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57579159/