全新编码并试图弄清楚如何评估用户输入是浮点数还是大于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的数字,但如果有更好的方法我会喜欢学习它!
谢谢!
答案 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)
有几种不同的方法可以解决这个问题。更常见的方法是使用loop
,until
或while
。我通常更喜欢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"
现在,如果有一个版本的方法返回false
或nil
进行无效输入,而不是引发异常,那就不错了,但即使现在它也是如此提供了另一种编写代码的方法:
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
变量。当循环结束时,您知道您具有正值。