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

Ruby确定字符串是否只包含数字,ruby,regex,string,integer,Ruby,Regex,String,Integer,我试图创建一个方法,要求用户创建一个pin码,比如银行账户pin码。它的长度只能是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

我试图创建一个方法,要求用户创建一个pin码,比如银行账户pin码。它的长度只能是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'转换为2134。同样,如果字符串中没有整数,它会将值记录为0,这不是我需要的假值

我发现了一篇非常有用的帖子,但在处理regexp的过程中似乎变得非常复杂。此帖子也被关闭,因为创建者不够具体:

所以我会尽量澄清,我试图限制用户输入,这样他们只能键入数字0到9。像10^3这样的数学公式必须是失败的,还有像-1234这样的负数,我正试图将它们限制为四位数,就像限制任何引脚一样。到目前为止,我完全被难住了,还没有找到一种不包含一大堆regexp的方法

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

谢谢


为了更好的措辞和纠正我在第二段中写的一个错误而编辑。

以下将起作用:

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

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

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”等。

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

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
你可以在这个网站上玩正则表达式:

试试这个:

def valid_pin?(pin)
  /^\d{4}$/ === pin
end
这基本上是说:

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

    puts "Please give us a 4 digit pin number for your account:"
    @response = gets.chomp 
    
    unless valid_pin?(@response)
      puts "Your response must be 4 numbers in length."
      create_pin
    else
      @pin = @response.to_i
      puts "Your pin has been set."
    end
    

    如果你想尝试学习正则表达式(通常称为正则表达式),我鼓励你在这个很棒的网站上玩一玩,这里有一个通用的关键字列表和正则表达式沙盒,可以帮助你编写文本。

    这是一个微不足道的正则表达式。就我个人而言,我建议你多花点时间来弄清楚,或者让我们看看你做了什么。没有比这更简单的了,而且很容易搜索。老实说,我不知道如何使用regexp。我想知道是否有像numeric这样的特殊方法?(这不起作用)我可以运行,但我想我迟早要学习regexp。而且,我永远不知道我发布的代码是太多还是太少。我应该继续讨论主题,但我永远不知道主题是什么,因为我的许多错误都与语法有关。“它将值记录为nil,这并不是我所需要的错误。”只是澄清一下,在ruby中,nil和false实际上是
    false
    中唯一的错误。您的问题不是
    nil
    ,而是当调用
    to\u i
    时,以非数字字符开头的
    字符串将返回
    0
    。您的意思是将此字符串转换为
    整数
    ,然后询问这是
    整数
    。答案很明显,这是因为你刚刚做了一个。正则表达式技能对于任何开发都是强制性的。所以我注意到了。wvandaal和hbejgel都把我和Rubular联系在一起。对于初学者来说,这似乎是一个很好的资源。还有,工程师们你说得对,我的意思是键入0而不是nil。当所有只使用字母的PIN实际传递并保存为0时,我发现了这个问题。我会修改它。这是正确的正则表达式。如果您使用,您可以简化命令,并避免稍显粗糙的
    (因为它返回布尔值):
    /^\d{4}$/==“1234”=>true