如何确定给定的用户输入是Ruby中的Float,String还是Integer

时间:2018-09-24 15:26:21

标签: rubymine

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的作用吗?我只是以为他们将用户输入转换为字符串或数值。我实际上不知道如何检查输入内容,以查看他输入的内容是浮点数,字符串还是小数。

我只是不断收到语法错误。我只想知道如何检查这三个值中的任何一个并进行相应的处理。

1 个答案:

答案 0 :(得分:0)

您的问题很多,所以我建议您阅读How do I ask a good question?,以帮助将来获得答案。我将仔细研究您的每一个问题,并尝试提供答案,为您指明正确的方向。

is_a?方法works by accepting a class as a parameter and returning boolean。例如:

'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方法为defined on the String class,它将字符串转换为Integer。如果字符串的开头没有有效的整数,则它将返回0。例如:

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

.to_s method on the Integer class将返回整数的字符串表示形式。例如:

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 elsewhere on stackoverflow行为的更详细说明。

您的最后一个问题是“我只想知道如何检查3个值中的任何一个并相应地进行处理。” This answer解释了如何执行此操作,但是代码示例的编写方式难以解读,因此,我在下面以扩展形式对其进行了重新编写,以使其清楚地了解正在发生的事情:

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。如果无法转换,则会引发异常。例如:

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并显示错误消息。”

我希望这会有所帮助并回答您的问题。

相关问题