【问题标题】:How to Determine if a given User input is a Float, String, or a Integer in Ruby如何在 Ruby 中确定给定的用户输入是浮点数、字符串还是整数
【发布时间】:2018-09-24 15:26:21
【问题描述】:

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 个值中的任何一个并相应地处理它们。

【问题讨论】:

    标签: rubymine


    【解决方案1】:

    您的问题有很多,因此我建议您阅读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 并将字符串转换为整数。如果字符串开头没有有效整数,则返回0。例如:

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

    .to_smethod 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 语句的块。你可以找到breakelsewhere 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('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 并显示错误消息。”

    我希望这有助于并回答您的问题。

    【讨论】:

      猜你喜欢
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2021-05-14
      • 2018-03-20
      • 2019-10-05
      • 2020-05-05
      相关资源
      最近更新 更多