检查数组的内容是否全部为整数

Checking if content of an array is all integers

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

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

使用 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 check if string is a number",您会找到更多信息。

另请注意,上面的操作会在找到非整数后立即失败,而不是等到之后。

你显然不能 gets.chomp.to_i(或等价物,gets.to_i),因为那只会是 return 整数。因此,在将字符串添加到数组之前,您需要先查看该字符串是否代表数字。

您可以使用正则表达式来做到这一点,或者确认 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

最后两个示例表明,在使用此方法时,您可以从 gets.chomp.strip 中删除 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