我正在处理排序代码。我想检查我的数组是否包含非整数。这是我的代码:
array = Array.new
puts "Please enter your 3 digits."
3.times do
str = gets.chomp.to_i
array.push str.to_i
end
if array.is_a?(Numeric) == false
puts "Error, only use Integers please!"
else
print "Here are your sorted numbers: #{array.sort}"
end
答案 0 :(得分:2)
你显然不能gets.chomp.to_i
(或等效的gets.to_i
),因为那只会返回整数。因此,您需要在将字符串添加到数组之前查看字符串是否表示数字。
您可以使用正则表达式执行此操作,或确认Kernel::Integer不会引发异常(如果有异常则捕获它)。
一个可行的正则表达式就是:
str =~ /^-?\d+$/
后
str = gets.chomp.strip
使用Kernel::Integer
:
def integer?(str)
begin
Integer(str)
rescue ArgumentError
return false
end
str.to_i
end
例如,
integer?("-33") #=> -33
integer?("-x33") #=> false
integer?(" 33 ") #=> 33
integer?("33\n") #=> 33
最后两个示例显示,使用此方法时,您可以从chomp.strip
删除gets.chomp.strip
。
如果要允许整数或浮点数,请将正则表达式更改为:
/^-?\d+\.?\d*$/
或检查Kernel::Float是否会引发异常:
def float?(str)
begin
Float(str)
rescue ArgumentError
return false
end
str.to_f
end
float?("-33.4") #=> -33.4
float?("-33") #=> -33.0
float?("x33.4") #=> false
float?(" 33.4\n") #=> 33.4
答案 1 :(得分:1)
使用上面的代码,array
保证包含整数,因为您使用to_i
将输入转换为整数:
array.push str.to_i
你实际上是在做两次。当您从STDIN读取字符串并将其推入阵列时。
在致电to_i
之前,您需要检查输入是否为字符串。
3.times do
str = gets.chomp
# code to verify if str is numeric.
array.push str
end
根据您的要求,有很多方法可以实现该代码。整数只能这样做:
unless str =~ /^\d+$/
puts "Error, only use Integers please!"
exit
end
以上内容适用于任何正整数,但不适用于负数。如果允许小数,它也会失败。但它给了你一个想法。搜索“ruby检查字符串是否为数字”,您将找到更多信息。
另请注意,一旦找到非整数而不是等到之后,上述内容就会失败。