验证整数输入上的字符串,Ruby



我正在与Ruby练习一点,我想处理年龄的输入,例如,如果某人类型"十一"而不是11,我想显示一条消息,即知道他/她不能使用弦。

这是我的代码

saludo = "Hola ¿Como te llamas?"
puts saludo
STDOUT.flush
#STDOUT es una constante global que almacena las salidas del programa. flush vacía cualquier dato almacenado, y por lo tanto, limpiará cualquier resultado anterior.
nombre = gets
STDOUT.flush
puts "Entonces te llamas #{nombre}"
puts "¿Cuantos años tienes?"
edad = Integer(gets.chomp)
#gets.chomp elimina el /n de gets
#El .to_i pasa el String a Integer
if edad > 0
  if edad >= 18
    puts "Eres mayor de edad, puedes votar y esas cosas"
  else
    puts "Tienes que moverte con el permiso de tus padres."
  end
else
  puts "prueba"
end    

我一直这样做。在String类中添加一种方法来进行检查使事情变得容易得多。

class String
  def is_i?
    !!Integer(self)
    rescue ArgumentError, TypeError
      false
  end
end
puts "1".is_i?
puts "asda".is_i?

有些人可能不喜欢它,因为它使用了例外,但我认为它很好。

如果要检查输入的数据类型,则可以使用类似的内容:

input = gets.chomp
input.class == Fixnum

由于Ruby中的每个输入都被视为字符串,您可以使用to_i将输入转换为Integer,例如:

input = gets.to_i

检查输入值是否为0,这是字符串转换为整数所取的默认值:

if input == 0
puts("Please enter an integer")

如果您使用的是gets并且希望收到一个数字,将其解析为整数,则可以"跳过" chomp,这样使用gets.to_i,您可以从整数中的用户,您可以看到所有不是数字转换为 0的所有内容,因此您可以检查操作后的edad是否为0 edad.zero?,并且这样可以显示您的消息:

puts '¿Cuantos años tienes?'
edad = gets.to_i
if edad.zero?
  puts 'Debes ingresar un número'
end

您可以将edad初始化为0,然后使用until创建一个循环,该循环要求用户输入一个数字,因此,当edad获取非零值时,until循环的代码出现,您可以通过下一步:

edad = 0
until !edad.zero?
  puts '¿Cuantos años tienes?'
  edad = gets.to_i
  if edad.zero?
    puts 'Debes ingresar un número'
  end
end
puts edad

如果您进行Integer(gets.chomp)如果gets.chomp不是严格的整数字符串(即1、2,-12等(,它将引起错误

因此您可以这样做:

input_string = gets.chomp
edad = nil
begin
  edad = Integer(input_string)
rescue 
  puts "#{input_string} is not an integer"
end
# edad will still be nil if there was a problem

input = gets.chomp

if input != "0" && input.to_i == 0
    puts "Invalid age format. Integer expected"
else
    age = input.to_i
end

更红宝石的方式

使用 case-expression 它允许您将输入与字符串式比较,从而否定了使用String#to_i的需求:

#age.rb
loop do
  puts 'Enter age'
  case gets.chomp
  when /D/
    puts 'Digits only, try again', '======================'
  when '0'..'17'
    puts 'too young'
    break
  when '18'..'120'
    puts 'old enough'
    break
  else
    puts 'Invalid age, try again', '======================'
  end
end

使用Kernel#loop确保您继续向用户询问输入,直到他们进入有效年龄为止。有效年龄在案例表达中定义为0 - 120。如果输入有效的年龄,则用break打破循环。


运行代码

$ ruby age.rb
Enter age
eleven
#Digits only, try again
#======================
Enter age
10000
#Invalid age, try again
#======================
Enter age
5
#too young
$ ruby vote.rb
Enter age
35
#old enough

最新更新