Ruby 如何检查变量是整数还是浮点

Ruby 如何检查变量是整数还是浮点,ruby,Ruby,我想检查我的变量是整数还是浮点。这是一个计算器。我不希望它无限期地循环 我该怎么做?我试着做到以下几点: puts "Enter a number: " num1 = gets.chomp() while !(num1 == Integer.superclass or num1 == Float.superclass) puts "Enter an actual number: " num1 = gets.chomp() end 一般来说,有一种选择: 10.class == Inte

我想检查我的变量是整数还是浮点。这是一个计算器。我不希望它无限期地循环

我该怎么做?我试着做到以下几点:

puts "Enter a number: "
num1 = gets.chomp()
while !(num1 == Integer.superclass or num1 == Float.superclass)
  puts "Enter an actual number: "
  num1 = gets.chomp()
end

一般来说,有一种选择:

10.class == Integer # => true
10.5.class == Float # => true
或者,另一个:

10.is_a? Integer # => true
10.5.is_a? Float # => true
但由于输入是一个字符串,因此这可能是检查字符串是整数还是浮点数的一个可行解决方案,可以对
字符串
类进行修补:

module StringFloatOrInteger
  def integer_or_float?
   begin !!Float(self) rescue false end
  end

  def integer_not_float?
    begin !!Integer(self) rescue false end  
  end

  def integer?
    integer_not_float? & integer_or_float?
  end

  def float?
    !integer_not_float? & integer_or_float?
  end
end

String.include StringFloatOrInteger

"home".integer? # => false
"home".float? # => false
"10".integer? # => true
"10".float? # => false
"10.5".integer? # => false
"10.5".float? # => true
在您的情况下,您可以这样使用,请求n次输入

def get_integer
  2.times do # or whatever times
    puts "Please enter an integer: "
    input = gets.chomp
    return input.to_i if input.integer?
  end
  return nil # or whatever
end

number = get_integer

如果要检查某个变量是否属于某种类型,只需使用种类?:

1.kind_of? Integer #true


(1.5).kind_of? Float #true

由于输入是一个字符串,因此需要首先将其转换为整数或浮点

因此,如果您执行以下操作,并且输入为“hello”,它将返回
0.0

num1 = gets.chomp.to_f
如果希望严格验证它是否为整数,则可以通过

input = gets.chomp
until input.is_a?(Fixnum) do
 print "Please enter a number: "
 input = Integer(gets.chomp) rescue nil
end

天哪,你让我意识到我做错了什么。如果num1是一封信,那么这句话还能用吗?比方说,如果我输入“a”作为num1,它还会转换成浮点吗?不会,它会返回0.0。检查我添加的开始/救援。你必须营救
ArgumentError
好的,最后一件事,如果我想检查营救是否被解雇,我该怎么做?我已经更新了我的答案,以满足你的要求。希望这能有所帮助?实际上回答了我想问的另一个问题,而且效果更好。非常感谢你。由于Fixnum已被弃用,是否有替代方案。或者它是这样好吗?编辑了我的答案,以防万一:您的变量
num1
始终是一个字符串,而不是整数或浮点。
get
不解释用户输入,它只返回一个字符串。这完全正确。然而,这并不是OP想要的。