Как проверить, является ли пользовательский ввод целым числом в Ruby? - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь выполнить цикл, пока пользователь не введет целое число.Когда пользователь вводит букву, следующий код должен напечатать «Думайте о числе»:

print "Think of a number "

while user_input = gets.to_i
  if user_input.is_a? Integer
    puts "your number is #{user_input}"
    break
  else
    print "Think of a number "
  end 
end 

Я успешно справился с моим кодом, когда пользователь вводит целое число.Однако когда пользователь вводит строку, метод to_i возвращает 0 и не выполняет оператор else, потому что это число.

Ответы [ 4 ]

0 голосов
/ 19 февраля 2019

Если вы хотите принимать только положительные цифры, вы можете использовать диапазон :

user_input = gets.chomp 
if ('0'..'9').cover? user_input
0 голосов
/ 19 февраля 2019

Я столкнулся с подобной проблемой.Я закончил тем, что сделал:

if user_input.strip == user_input.to_i.to_s
  # More code here!
end

Тестирование для поплавка будет:

if user_input.strip == user_input.to_f.to_s
  # More code here!
end

Решил мою проблему.Посмотрите, поможет ли это.

0 голосов
/ 19 февраля 2019

Основная проблема с вашим кодом состоит в том, что String#to_i метод всеяден.

"0".to_i #⇒ 0
"0.1".to_i #⇒ 0
"foo".to_i #⇒ 0

Тем не менее, user_input в вашем коде всегда целое .

То, что вы, вероятно, хотите, это принимать только цифры (и, возможно, ведущий минус для негативов.) Единственный краткий способ принять подмножество символов - это регулярное выражение.

# chomp to strip out trailing carriage return
user_input = gets.chomp 

if user_input =~ /\A-?\d+\z/
  ...

Регулярное выражение выше ничего не значитза исключением цифр с необязательным начальным минусом.


Или, что еще лучше (кредиты @Stefan)

if gets =~ /\A-?\d+\Z/
0 голосов
/ 19 февраля 2019

пусть проверка ниже одного использованного Integer(gets.chomp) rescue ''

print "Think of a number "

while user_input = Integer(gets.chomp) rescue ''
  if user_input.is_a? Integer
    puts "your number is #{user_input}"
    break
  else
    print "Think of a number "
  end
end
...