13

我有一段代码要求用户输入一个数字作为我的问题的答案。我可以做到to_i,但棘手/垃圾输入会通过to_i. 例如,如果用户输入693iirum5作为答案,那么 #to_i 会将其剥离为693.

请建议一个函数,而不是正则表达式。提前感谢您的回复。

4

5 回答 5

18

这将验证输入:

Integer(gets) rescue nil
于 2013-02-15T17:56:20.133 回答
7

为了回答camdixon 的问题,我提交了这个提议的解决方案。

使用接受的答案,而不是rescue nil使用rescue false和包装你的代码在一个简单的 if 中。

例子

print "Integer please: " 
user_num=Integer(gets) rescue false 
if user_num 
    # code 
end
于 2015-04-03T10:18:31.207 回答
3

用于在没有正则表达式的情况下input_string.to_i.to_s == input_string验证 是否为整数。input_string

> input_string = "11a12"
> input_string.to_i.to_s == input_string
=> false
> input_string = "11"
> input_string.to_i.to_s == input_string
=> true
> input_string = "11.5"
> input_string.to_i.to_s == input_string
=> false   
于 2013-02-15T18:00:11.770 回答
2

使用内核#Integer

如果传递了无效值,则会引发Kernel#Integer方法。ArgumentError: invalid value for Integer()方法描述部分说:

[S] 字符串应严格符合数字表示。此行为与 String#to_i 的行为不同。

换句话说,虽然String#to_i强制将值转换为整数,但 Kernel#Integer 将确保该值在转换之前已经是格式正确的。

模拟行为的示例Integer(gets)

Integer(1)
# => 1

Integer('2')
# => 2

Integer("1foo2\n")
# => ArgumentError: invalid value for Integer(): "1foo2\n"
于 2013-02-15T18:20:43.137 回答
0

to_i 很好,但一切都取决于你在垃圾输入的情况下想要什么。无?如果你想要 693iirum5 返回其他东西,你可以解析输入的字符串,你需要一个正则表达式来检查字符串。既然您要求不要提供正则表达式,我不会,也许您可​​以明确您真正希望它返回的内容。

于 2013-02-15T18:01:01.520 回答