Как определить, является ли данный пользовательский ввод Float, String или Integer в Ruby - PullRequest
0 голосов
/ 24 сентября 2018

Метод is_a? не работает;Я попробовал это, и он, по-видимому, проверяет, является ли значение производным от объекта или чего-то еще.

Я пробовал что-то вроде этого:

printf "What is the Regular Price of the book that you are purchasing?"
regular_price=gets.chomp

if regular_price.to_i.to_s == regular_price
  print "Thank You  #{regular_price}"
  break
else
  print "Please enter your price as a number"
end

Может кто-нибудь объяснить мне больше, что .to_i а .to_s делать?Я просто думал, что они преобразуют пользовательский ввод в строку или числовое значение.Я на самом деле не знаю, как проверить ввод, чтобы увидеть, было ли то, что он вставил, с плавающей точкой, строкой или десятичной дробью.

Я просто продолжаю получать синтаксические ошибки.Я просто хочу знать, как проверить любое из 3 значений и обработать их соответствующим образом.

1 Ответ

0 голосов
/ 24 сентября 2018

В вашем вопросе много вопросов, поэтому я рекомендую вам прочитать Как мне задать хороший вопрос? , чтобы помочь вам получить ответы в будущем.Я рассмотрю все ваши вопросы и постараюсь дать ответы, которые укажут вам правильное направление.

Метод is_a? работает, принимая класс в качестве параметра и возвращая логическое значение ,Например:

'foo'.is_a?(String)
=> true

1234.is_a?(Integer)
=> true

'foo'.is_a?(Integer)
=> false

1234.is_a?(String)
=> false

1.234.is_a?(Float)
=> true

Метод .to_i определен для класса String и преобразует строку в целое число.Если в начале строки нет действительного целого числа, оно вернет 0.Например:

"12345".to_i             #=> 12345
"99 red balloons".to_i   #=> 99
"0a".to_i                #=> 0
"hello".to_i             #=> 0

Метод .to_s класса Integer вернет строковое представление целого числа.Например:

1234.to_s
=> '1234'

То же самое относится к Float:

1.234.to_s
=> '1.234'

Теперь давайте посмотрим на ваш код.Когда я запускаю его, я получаю SyntaxError: (eval):4: Can't escape from eval with break, что происходит, потому что break не из чего выйти;он не используется для выхода из оператора if, а вместо этого используется для выхода из блока.Например:

if true
  break
end

вызывает ошибку.Но это не так:

loop do
  if true
    break
  end
end

Причина в том, что при вызове break говорится "вырваться из окружающего блока", который в данном случае является блоком loop do ... end.В предыдущем примере не было блока с оператором if.Вы можете найти более подробное объяснение поведения break в другом месте в stackoverflow .

Ваш последний вопрос был: «Я просто хочу знать, как проверить любое из 3 значений и обработатьих соответственно. " Этот ответ объясняет, как это сделать, но пример кода написан так, что его трудно расшифровать, поэтому я переписал его ниже в расширенной форме, чтобы прояснить, что происходит:

regular_price = gets.chomp

begin
  puts Integer(regular_price)
rescue
  begin
    puts Float(regular_price)
  rescue
    puts 'please enter your price as an Integer or Float'
  end
end

Этот код сначала пытается преобразовать строку regular_price в целое число.Это вызывает исключение, если оно не может быть преобразовано.Например:

Integer('1234')
=> 1234

Integer('1.234')
ArgumentError: invalid value for Integer(): "1.234"

Integer('foo')
ArgumentError: invalid value for Integer(): "foo"

Если возбуждено исключение, то строка rescue останавливает возбуждение исключения и вместо этого продолжает выполнение на следующей строке.В этом случае мы говорим: «Если вы не можете конвертировать в Integer, тогда rescue и попробуйте конвертировать в Float».Это работает так же, как преобразование в Integer:

Float('1.234')
=> 1.234

Float('foo')
ArgumentError: invalid value for Float(): "foo"

Наконец, мы говорим: «Если вы не можете преобразовать в Float, тогда rescue и отображаете сообщение об ошибке».

Надеюсь, это поможет и ответит на ваши вопросы.

...