【问题标题】:How to create a loop based on user input of float/integer vs string in Ruby?如何根据用户输入的浮点数/整数与 Ruby 中的字符串创建循环?
【发布时间】:2017-06-29 10:57:51
【问题描述】:

编码新手并试图弄清楚如何评估用户输入是大于 0 的浮点数还是整数,如果不是,则继续提示他们做出响应,直到他们给我一个符合此标准的响应。

我已经能够想出以下方法来帮助我将有效响应(数字 > 0)与无效响应(字符串或数字

input = "How much money do you have?"
print input
money_1 = gets.chomp.to_f
  if money_1 > 0 
   puts "You have $#{money_1}."
  else
   puts "Please enter a valid amount"
   print input
end

我想不通的是如何把它变成一个循环,这样用户就必须不断输入响应,直到他们输入一个大于 0 的数字。

有什么建议吗?似乎这应该是一个显而易见的答案,但经过几个小时的挖掘和尝试,我还没有找到任何有效的方法。

我也很想知道是否有比我的解决方法更简单的方法来评估用户输入是浮点数还是整数还是字符串,然后不断提示他们做出响应,直到他们给我浮点数或整数。问题是我需要将他们的输入转换为浮点数,以便能够在代码后面的方程式中使用它,这就是为什么我想出这个解决方法的原因,因为我认为任何字符串都会被转换为 0,而我真的只是寻找大于 0 的数字,但如果有更好的方法我很乐意学习它!

谢谢!

【问题讨论】:

  • 如果您发现任何有用的答案,请务必通过单击相应的“灰色勾号”使其变为绿色来“接受”答案。

标签: ruby string loops input integer


【解决方案1】:

使用Kernel#loop,类似这样:

input = "How much money do you have?" 
puts input
money_1 = gets.to_f

loop do
  if money_1 > 0 
    puts "You have $#{"%.2f" % money_1}"
    break
  else
    puts "Please enter a valid amount",
         input
  end
  money_1 = gets.to_f
end

如果您不再需要 money_1 变量或在循环之外,以下内容就足够了:

loop do
  puts "How much money do you have?" 
  money_1 = gets.to_f
  if money_1 > 0 
    puts "You have $#{"%.2f" % money_1}"
    break
  else
    puts "Please enter a valid amount"
  end
end

【讨论】:

  • 这个写的有点问题;循环后,money_1 超出范围,无法使用。
  • break puts 对我来说似乎很奇怪。有两个语句会不会更清楚,puts 然后break
  • @CarySwoveland 重新评论:“奇怪”哈,是的,我认为您可能是对的,我认为我从未在任何地方看到过这样的事情,所以不知道我为什么这样做。关于第二条评论:很酷,我会查看您刚刚发布的答案,不知道您可以那样做。
【解决方案2】:

如果你把循环退出测试放在最后,你就不需要在循环之前有多余的语句了。

begin
  puts "How much money do you have?" 
  money_1 = Float(gets) rescue 0
  puts money_1 > 0 ? "You have $#{"%.2f" % money_1}" : "Please enter a valid amount"
end until money_1 > 0

我还将if puts ... else puts... end 减少为一行。

【讨论】:

  • 不错。只是一个错字money1
  • @sagarpandya82,感谢您的关注和赞美。仔细想想,我想知道money_1 中的1 指的是什么。我想我会使用 amount 之类的东西。
  • 有趣的是,Matz dislikes this idiom and wishes he'd never included it in the language。他甚至表示他将来可能会删除它,尽管我个人认为这不太可能发生。
【解决方案3】:

你也可以像这样使用while循环:

while (input = gets.chomp.to_f) <= 0
  puts "enter a valid input"
end
puts "you have $#{input}"

这使用内联变量赋值。 input 变量在每个循环中使用新的 gets 调用重新定义。当循环结束时,你知道你有一个正值。

【讨论】:

    【解决方案4】:

    有几种不同的方法可以解决这个问题。更常见的方法是使用loopuntilwhile。我一般更喜欢loop,但while在这种特定情况下更简单一些:

    input = "How much money do you have?"
    print input
    keep_going = true 
    while keep_going
      money_1 = gets.chomp.to_f
      if money_1 > 0 
        puts "You have $#{money_1}."
        keep_going = false
      else
        puts "Please enter a valid amount"
      end
    end
    

    您还询问了其他识别花车的方法;对于String#to_f,像“Hello”这样的字符串结果为零,与“0”相同;但是,Float() 方法如果传递了不适当的字符串,则会引发异常:

    "hello".to_f #=> 0.0
    Float("Hello") #=> ArgumentError: invalid value for Float(): "hello"
    

    现在,如果该方法的某个版本返回 falsenil 用于无效输入,而不是引发异常,那就太好了,但即使现在它提供了另一种编写方式你的代码:

    puts "How much money do you have?"
    
    begin
      money_1 = Float(gets) # \n at the end is ignored by Float()
    rescue ArgumentError
      puts "Please enter a valid amount."
      retry
    end
    
    puts "You have $#{money_1}."
    

    如果有一个假设的 Float?() 方法返回 false 而不是引发异常,您可以这样写:

    puts "How much money do you have?"
    until money_1 = Float?(gets)
      puts "Please enter a valid amount."
    end
    puts "You have $#{money_1}."
    

    这样会好很多,因为通过引发和拯救异常来处理非常正常的情况(例如错误的用户输入)是非常糟糕的形式。

    【讨论】:

    • OP 的money_1 = gets.chomp.to_f; if money_1 &gt; 0 ... 有两个目的。一种是将零或非数字值(例如,"cat")视为无效(如"cat".to_f #=&gt; 0.0)。第二个目的是忽略负浮动。您的方法处理第一个(比to_f 更好,因为它将消除"9lives"to_f 会很高兴地转换为9.0,并且也会接受1.0e8 #=&gt; 100000000.0,我认为它应该),但不是与第二个。当然,这是一个小问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    相关资源
    最近更新 更多