如何干净地验证用户输入是否是Ruby中的整数?

时间:2013-02-15 17:52:35

标签: ruby validation integer

我有一段代码,我要求用户输入一个数字作为我的问题的答案。 我可以做to_i但是棘手/垃圾输入会通过to_i逃脱。例如,如果用户输入693iirum5作为答案,则#to_i会将其删除为693

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

5 个答案:

答案 0 :(得分:16)

这将验证输入:

Integer(gets) rescue nil

答案 1 :(得分:6)

在回答camdixon's问题时,我提交了这个提议的解决方案。

使用接受的答案,但不是rescue nil,而是使用rescue false并将代码换成简单的if。

实施例

print "Integer please: " 
user_num=Integer(gets) rescue false 
if user_num 
    # code 
end

答案 2 :(得分: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   

答案 3 :(得分:2)

使用内核#Integer

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

  

[S] trings应严格遵守数字表示。此行为与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"

答案 4 :(得分:0)

to_i很好,但一切都取决于垃圾输入时你想要的东西。没?你可以使用整数(值)和救援,如果它不是一个整数,与Float相同 如果你想要693iirum5返回别的东西,你可以解析输入的字符串,你需要一个正则表达式来检查字符串。既然你要求不给正则表达式我不会,也许你可以清楚你真正希望它返回什么。