gets: Как определить, что пользователь ввёл НЕ число?

[А] Алексей Щёголев, 21 июля 2016, 19:51 , 4 подписчика
puts "Task 6-1: Car Lottery"
cars = ["Toyota", "Lada Sedan", "Mersedes", "Kalina", "Vesta", "Renault", "Honda"]
puts "У нас всего #{cars.size} автомобилей. Вам какой?"
choiseOfPlayer = gets.to_i
if (choiseOfPlayer < 0) or (choiseOfPlayer > cars.size) 
    puts "такой номер не доспустим"
else 
    puts "Ваша модель: " + cars[choiseOfPlayer].to_s
end

Если пользователь ведет кусок текста а не цифры, то программа выдаст 1й элемент массива. Как сделать проверку на то, что введенное пользователем является числом?

Обсуждение (9)


Алексей Щёголев

[А]

Так то, есть подозрение, что у переменной можно как то зпросить тип... ну, то есть, если есть способ сменить тип переменной налету со строки в в число, то наверно можно как то и спросить у переменной, а какого ты типа?


Михаил Бутлицкий Учитель

[М]

Кратко есть такой путь

http://stackoverflow.com/questions/14900490/how-to-cleanly-verify-if-the-user-input-is-an-integer-in-ruby

Подробнее Вадик позже ответит.


Вадим Венедиктов Учитель

[В]

Всё очень просто: метод to_i, вызванный у строки, переводит её в целое число, а если ему не удается это сделать (если первый символ строки — не цифра), то он возвращает 0. Смотрите:

> '25'.to_i
 => 25

> '1238'.to_i
 => 1238

> '1,25'.to_i
 => 1

> '1.25'.to_i
 => 1

> 'a1.25'.to_i
 => 0

> 'Я строка'.to_i
 => 0

Так то, есть подозрение, что у переменной можно как то зпросить тип...

Совершенно верно. Действительно, у переменной всегда можно спросить, к какому типу (в Руби — к какому классу) она принадлежит. Почитайте в конспекте 4-го урока.

Однако, с gets нас ждёт разочарование, т.к. он всегда возвращает строку, поэтому ваш вопрос надо немного изменить: «Как понять, что строка содержит целое число?». А тут уже нужно немного проявить смекалку. Предлагаю вам решить эту мини-задачку самостоятельно.

Если не догадаетесь — пишите, расскажу ;)

p.s. Кстати, для проверки всяких гипотез и решения простых задачек, удобно пользоваться irb. Про эту интерактивную ruby-консоль Миша недавно снял бонусный урок.


Алексей Щёголев

[А]

puts "Task 6-3: Car Lottery"
cars = ["Toyota", "Lada Sedan", "Mersedes", "Kalina", "Vesta", "Renault", "Honda"]
puts "У нас всего #{cars.size} автомобилей. Вам какой?"
choise_of_player = gets.chomp
string_numbers = ["1","2","3","4","5","6","7","8","9","0"]

if choise_of_player.length > 1 
    abort "такой номер не доспустим: более двух знаков"
end
if string_numbers.include?(choise_of_player) 
    if  ((choise_of_player.to_i < 0) or (choise_of_player.to_i > cars.size)) 
    abort "такой номер не доспустим: больше количества марок"
    else 
    puts "Ваша модель: " + cars[choise_of_player.to_i].to_s
    end
else
    abort "такой номер не допустим: введенное не номер"
end

решение не универсальное, конечно, но для этого случая пойдёт.


Вадим Венедиктов Учитель

[В]

Отлично придумано, не слишком изящно, но надёжно.

Я предлагаю такое решение:

choice = gets.chomp

if choice.to_i > 0 || choice == '0'
  puts 'Пользователь ввёл-таки число'
else
  puts 'Пользователь ввёл что-то непонятное'
end

Алексей Щёголев

[А]

От я идиот...


Вадим Венедиктов Учитель

[В]

От я идиот...

Категорически несогласен! Всё приходит с опытом ;)


[И]

Но ведь 0 - это тоже число. А есть еще и отрицательные числа... Как тогда проверять и ноль и отрицательные числа, если они нам тоже нужны?


Михаил Бутлицкий Учитель

[М]

Описанные тут методы подойдут http://stackoverflow.com/questions/14900490/how-to-cleanly-verify-if-the-user-input-is-an-integer-in-ruby

Integer(gets) rescue nil

или

input_string.to_i.to_s == input_string