Ruby 所以我希望用户的答案只包括0到9的数字。。我该怎么做?
正如我在标题中所要求的那样。当用户输入了一些只包含数字的值时,我如何创建一个中断的循环,如果没有,它会说重试Ruby 所以我希望用户的答案只包括0到9的数字。。我该怎么做?,ruby,Ruby,正如我在标题中所要求的那样。当用户输入了一些只包含数字的值时,我如何创建一个中断的循环,如果没有,它会说重试 prompt = "> " puts "What is the salary for the accountant: " print prompt while accountant = gets.chomp if accountant == (0..9) puts "Nice" break el
prompt = "> "
puts "What is the salary for the accountant: "
print prompt
while accountant = gets.chomp
if accountant == (0..9)
puts "Nice"
break
else
"try again"
print prompt
end
end
end
您的问题在这一行:
if accountant == (0..9)
这是检查值是否等于一个范围-这不是您想要的
由于来自get.chomp
的输入将始终是一个字符串,因此需要检查它是否只包含以下字符:“0”
,“1”
,“2”
。。。和“9”
一种方法是使用正则表达式:
if accountant =~ /\A\d+\z/
表示“字符串开头”\A
表示“字符串结束”\z
表示“一个或多个数字”(0-9)\d+
请注意,您在评论中建议的解决方案,
/^-?[0-9]+$/
,存在缺陷,因为:
表示“行的开始”(因此可以在换行之前插入任意其他字符)^
表示“行尾”(因此可以在换行后插入任意其他字符)$
还允许使用可选连字符。在这种情况下,这可能不是你想要的,因为输入的是工资——当然不能是负的李>-?
- 一个没有正则表达式的简单解决方案是:
如果您还不知道Ruby中的“==”操作符是如何工作的,那么您可能想了解它,因为如果您来自PHP或Javascript,它可能会令人困惑。accountant.chars.all?{|n| ("0".."9") === n}
现在,您正在比较一个字符串
(
)和一个accountary=gets.chomp
范围
(
),这两个范围永远不会相等。你要看的是一个数字是否在范围内,所以(0..9)
应该适合你(0..9)。cover?(accountary.to_i)
还请注意,无效答案将转换为零-例如如果accountary=~/\a\d+\z/
。因此,正如上面所建议的,正则表达式可能是一种更好的方法。我发现,如果accountary=~/^-?[0-9]+$/使用这个方法,那么允许负工资。可怜的员工:D不管怎样,我会选择“a”。to_i==0
或者换行符和非数字匹配的东西。@mudasobwa的建议是好的/\A-?[0-9]+\z/