我有一段代码要求用户输入一个数字作为我的问题的答案。我可以做到to_i
,但棘手/垃圾输入会通过to_i
. 例如,如果用户输入693iirum5
作为答案,那么 #to_i 会将其剥离为693
.
请建议一个函数,而不是正则表达式。提前感谢您的回复。
我有一段代码要求用户输入一个数字作为我的问题的答案。我可以做到to_i
,但棘手/垃圾输入会通过to_i
. 例如,如果用户输入693iirum5
作为答案,那么 #to_i 会将其剥离为693
.
请建议一个函数,而不是正则表达式。提前感谢您的回复。
这将验证输入:
Integer(gets) rescue nil
为了回答camdixon 的问题,我提交了这个提议的解决方案。
使用接受的答案,而不是rescue nil
使用rescue false
和包装你的代码在一个简单的 if 中。
print "Integer please: "
user_num=Integer(gets) rescue false
if user_num
# code
end
用于在没有正则表达式的情况下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
如果传递了无效值,则会引发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"
to_i 很好,但一切都取决于你在垃圾输入的情况下想要什么。无?如果你想要 693iirum5 返回其他东西,你可以解析输入的字符串,你需要一个正则表达式来检查字符串。既然您要求不要提供正则表达式,我不会,也许您可以明确您真正希望它返回的内容。