检查数组的内容是否都是整数

时间:2015-01-10 20:03:52

标签: ruby arrays

我正在处理排序代码。我想检查我的数组是否包含非整数。这是我的代码:

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

2 个答案:

答案 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检查字符串是否为数字”,您将找到更多信息。

另请注意,一旦找到非整数而不是等到之后,上述内容就会失败。