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

验证整数上的字符串';s输入,Ruby,ruby,string,validation,integer,Ruby,String,Validation,Integer,我正在用Ruby进行一些练习,我想处理年龄的输入,例如,如果有人键入“11”而不是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

我正在用Ruby进行一些练习,我想处理年龄的输入,例如,如果有人键入“11”而不是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    
执行
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
执行
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

如果您使用的是
gets
,并且希望收到一个数字,将其解析为整数,那么您可以通过使用
gets的方式“跳过”chomp
,因此,您可以检查操作后的
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

如果您使用的是
gets
,并且希望收到一个数字,将其解析为整数,那么您可以通过使用
gets的方式“跳过”chomp
,因此,您可以检查操作后的
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

我总是这样做的。向
String
类中添加一个方法来进行检查,使事情变得更加简单

class String
  def is_i?
    !!Integer(self)
    rescue ArgumentError, TypeError
      false
  end
end

puts "1".is_i?
puts "asda".is_i?

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

我一直都是这样做的。向
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

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

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

如果要检查输入的数据类型,可以使用以下方法:

input = gets.chomp
input.class == Fixnum
由于ruby中的每个输入都被视为字符串,因此可以使用
to_i
将输入转换为整数,如:

input = gets.to_i
检查输入值是否为0,这是转换为整数的字符串的默认值,如下所示:

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

如果要检查输入的数据类型,可以使用以下方法:

input = gets.chomp
input.class == Fixnum
由于ruby中的每个输入都被视为字符串,因此可以使用
to_i
将输入转换为整数,如:

input = gets.to_i
检查输入值是否为0,这是转换为整数的字符串的默认值,如下所示:

if input == 0
puts("Please enter an integer")
更红宝石的方式 使用允许您将输入与字符串范围进行比较的

#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
使用可确保您继续向用户请求输入,直到他们输入有效年龄。有效年龄在大小写表达式中定义为
0-120
。如果输入了有效的年龄,循环将以
break
中断


运行代码
$ruby age.rb
进入年龄
十一
#仅限数字,请重试
#======================
进入年龄
10000
#无效年龄,请重试
#======================
进入年龄
5.
#太年轻
$ruby vote.rb
进入年龄
35
#够大了
一种更加Ruby的方式 使用允许您将输入与字符串范围进行比较的

#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
使用可确保您继续向用户请求输入,直到他们输入有效年龄。有效年龄在大小写表达式中定义为
0-120
。如果输入了有效的年龄,循环将以
break
中断


运行代码
$ruby age.rb
进入年龄
十一
#仅限数字,请重试
#======================
进入年龄
10000
#无效年龄,请重试
#======================
进入年龄
5.
#太年轻
$ruby vote.rb
进入年龄
35
#够大了

不是我写的吗?我只是看到你没有提到FixedNum部分。为了完整起见,我添加了下一个检查。没有抄袭你的答案:)啊,我明白了,对不起!不是我写的吗?我只是看到你没有提到FixedNum部分。为了完整起见,我添加了下一个检查。没有抄袭你的答案:)啊,我明白了,对不起
self==self.to_i.to_s
可能不那么凌乱。没错。这真的取决于什么是可接受的。我创建的方法将(应该)接受任何有效的整数文本,我认为这是理想的。我不确定是否真的有另一种直接的方法来做到这一点。正则表达式也是一种有效的方法(事实上,可能更好),但是,嗯,足够好了。通常我倾向于使用正则表达式,但允许使用多少位数?10? 100? 十亿?Ruby的bignum系统将尝试容纳几乎任何东西。例如,试试
Integer('9'*1e6)
self==self.to\u i.to\u s
可能不那么凌乱。没错。这真的取决于什么是可接受的。我创建的方法将(应该)接受任何有效的整数文本,我认为这是理想的。我不确定是否真的有另一种直接的方法来做到这一点。正则表达式也是一种有效的方法(事实上,可能更好),但是,嗯,足够好了。通常我倾向于使用正则表达式,但允许使用多少位数?10? 100? 十亿?Ruby的bignum系统将尝试适应