Ruby确定字符串是否只包含数字

时间:2014-05-01 20:32:29

标签: ruby regex string integer

我正在尝试创建一种方法,要求用户创建一个密码,例如银行帐户密码。它的长度只能是4个数字,输入的每个字符必须是数字。我在使用此代码时发现:

puts "Please give us a 4 digit pin number for your account:"
@response = gets.chomp 

unless @response.to_i.is_a?(Integer) && @response.to_str.length == 4
    puts "Your response must be 4 numbers in length."
    create_pin
else
    @pin = @response.to_i
    puts "Your pin has been set."
end

它不能正常工作,因为.to_i方法很乐意转换' 2134a'同样,如果字符串中没有整数,它会将值记录为0,这不是我所需要的假。

Test if a string is basically an integer in quotes using Ruby?

我发现了一个非常有用的帖子,但它似乎在线程中变得非常复杂到regexp。这篇文章也被关闭了,因为创作者不够具体:

Check if string contains only positive numbers in Ruby

所以我试着说清楚,我试图限制用户输入,这样他们只能键入0到9的数字。数学方程式如10 ^ 3需要失败,以及负数如-1234 ,我试图将它们限制为四位数,就像任何引脚受限一样。到目前为止,我完全难以接受,并且没有找到一种方法来做到这一点并不包含一大堆正则表达式。

也许我可以检查字符串是否包含不可接受的字符列表。

非常感谢。

编辑更好的措辞并纠正我在第二段写的错误。

4 个答案:

答案 0 :(得分:7)

试试这个:

def valid_pin?(pin)
  /^\d{4}$/ === pin
end

这主要是说:

  1. /^d{4}$/是一个正则表达式,您可以告诉它,因为它包含在/ /中,中间有一个模式
  2. ^$字符分别表示字符串的开头和结尾。基本上可以确保的是,不会接受包含4个连续数字但在开头或结尾有其他字符的字符串(即"a1234""5678b")。
  3. \d是表示数字的正则表达式字符。当后跟{4}时,这意味着要查找正好4位数。 Ruby还允许您使用此表示法{3,}或范围{3,6}指定最小值。
  4. ===方法(正如 @iamnotmaynard 正确提到的),有时称为 threequals 运算符,返回布尔值(true或{ {1}})值取决于正则表达式是否与给定字符串匹配。
  5. 在您的代码中:

    false

    如果您想尝试了解正则表达式(通常称为RegExes),我建议您在精彩的网站Rubular上玩游戏,有一个通用的关键字列表和RegEx沙箱来帮助您发表您的作品。

答案 1 :(得分:0)

以下内容可行:

puts "Please give us a 4 digit pin number for your account:"
@response = gets.chomp 

unless @response.match(/\d{4}/) && @response.length == 4
  puts "Your response must be 4 numbers in length."
  create_pin
else
  @pin = @response.to_i
  puts "Your pin has been set."
end

答案 2 :(得分:0)

这可以使用正则表达式在几行中完成。像下面这样的东西应该完成它。

if @response =~ /^\d{4}$/
   @pin = @response
else
   puts "Your pin must be 4 numbers in length."
   create_pin
end

在正则表达式中,' ^'和' $'分别表示字符串的开头和结尾。添加这些保证您不会在您正在寻找的4位数之前或之后发生垃圾。因此,您可以避免使用' 1234a'

等答案

' \ d {4}'将匹配4个连续数字0-9。

因此,您已将用户范围缩小到只有“3421'' 9843'等”的回复。

答案 3 :(得分:0)

您应该尝试使用正则表达式:

unless /[0-9]{4}/.match(@response).to_s.length == 4 && @response.length == 4 
    puts "Your response must be 4 numbers in length."
    create_pin
else
    @pin = /[0-9]{4}/.match(@response).to_s.to_i
    puts "Your pin has been set."
end

您可以在本网站中使用正则表达式进行玩具:http://rubular.com/