如何在Ruby中基于float / integer vs string的用户输入创建循环?

时间:2017-02-10 23:44:35

标签: ruby string loops input integer

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

我已经能够提出以下内容,帮助我将无效响应(字符串或数字< = 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的数字,但如果有更好的方法我会喜欢学习它!

谢谢!

4 个答案:

答案 0 :(得分:2)

使用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

答案 1 :(得分: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缩减为一行。

答案 2 :(得分:1)

有几种不同的方法可以解决这个问题。更常见的方法是使用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,像#34; Hello"结果为零,与#34; 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}."

这样会更好,因为提高和抢救异常来处理糟糕的用户输入等非常正常的情况是非常糟糕的形式。

答案 3 :(得分:1)

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

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

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