检查 ruby 中的整数是否为正数

Check if integer is positive in ruby

我试图让用户输入一个正整数 (>=1)。如果用户输入负整数或 0,程序会注意到并说您没有输入有效整数,请重试。到目前为止,我的程序一直有效,直到我尝试输入一个字符串。输入字符串后我的程序中断。有人知道如何解决这个问题吗?

我试过 elsif !barsofsoap.match (/\A[-+]?[0-9]*.?[0-9]+\Z/) 放 "You didn't enter an integer, please put a positive integer",但没用

loop do
  puts "How many soaps are you looking to purchase? (Please put an integer)"
  x = gets.chomp
  barsofsoap = Integer(x) rescue false

  if barsofsoap >= 1
    break
  else
    puts "You didn't put an integer, please put an integer and try again."
  end
end

我希望如果用户输入字符串,程序不会中断。

你试试这个:num.positive?

看这里:https://ruby-doc.org/core-2.6/Numeric.html#method-i-positive-3F

您也可以尝试将文本转换为整数并通过执行此操作进行验证: num.is_a?(Integer)

https://ruby-doc.org/core-2.6/Object.html#method-i-is_a-3F

或者更好,因为输入始终是文本,您可以使用正则表达式来确保只输入数字:"12345" =~ /\A\d+\Z/

试试这个怎么样:

loop do
  puts "How many soaps are you looking to purchase? (Please put an integer)"

  barsofsoap = gets.chomp

  if barsofsoap.match(/^[\d]+$/).nil?
    puts "You didn't put an integer, please put an integer and try again."
  elsif barsofsoap.to_i.positive?
    break
  else
    puts "You didn't put an integer, please put an integer and try again."
  end
end

您当前代码失败的原因是因为您使用 false 作为救援值。你不能比较false >= 1。贴近您的原始代码,您可以将比较包装到 begin/end 块中。

loop do
  puts "How many soaps are you looking to purchase? (Please put an integer)"
  x = gets.chomp
  begin
    barsofsoap = Integer(x)
    if barsofsoap >= 1
      break
    end
  rescue ArgumentError => _error
    puts "You didn't put an integer, please put an integer and try again."
  end
end

或者简化代码:

loop do
  puts "How many soaps are you looking to purchase? (Please put an integer)"
  break if (barsofsoap = gets.to_i).positive?
  puts "Invalid input. Provide a positive integer."
end

以上代码没有检测输入是字符串还是整数。通过将 Integer(x) 替换为 x.to_i 如果无效,它将简单地 return 0。由于您希望用户提供一个正整数,因此它仍然要求他们提供一个新整数。

nil.to_i #=> 0
''.to_i #=> 0
'asdf'.to_i #=> 0
'12.34'.to_i #=> 12

如上所示,字符串 '12.34' 将生成值 12。根据您的要求,您可能不想使用此值,而是将其标记为无效输入。在这种情况下,您可以使用正则表达式来检查提供的输入。

loop do
  puts "How many soaps are you looking to purchase? (Please put an integer)"
  input = gets
  break barsofsoap = input.to_i if input.match?(/\A[1-9]\d*\Z/)
  puts "Invalid input. Provide a positive integer."
end

正则表达式 /\A[1-9]\d*\Z/ 将匹配以下内容:

  • \A 匹配字符串的开头。
  • [1-9] 匹配其中一个数字 1-9.
  • \d* 匹配零个或多个数字 0-9.
  • \Z 匹配字符串结尾。如果字符串以换行符结尾,则匹配换行符之前的位置。

其他选项,使用n.to_i.to_s == n检查输入是否为整数并将循环移动到方法中:

def get_input_integer
  loop do
    puts "Enter a positive Integer"
    n = gets.chomp
    if n.to_i.to_s == n
      return n.to_i if n.to_i.positive?
      puts "It's not positive"
    else
      puts "It's not an integer" 
    end
  end
end

x = get_input_integer