【问题标题】:Check if a string contains only digits in ruby检查字符串是否仅包含 ruby​​ 中的数字
【发布时间】:2016-09-28 09:27:29
【问题描述】:

我有一个作为参数传递给函数的字符串。在这里,我想检查字符串是否只包含数字。所以我做了如下检查:

def check_string(string)
  result = false
  if string.to_i.to_s.eql? string
    result =  true
  end
  result
end

但是当字符串以0开头时就会出现问题。在这种情况下,会返回一个false。

check_string('123')  #=> true
check_string('0123') #=> false

我该如何解决这个问题?

【问题讨论】:

标签: ruby


【解决方案1】:

你可以试试下面的

def check_string(string)
  string.scan(/\D/).empty?
end

如果字符串只包含数字或者它是一个空字符串,那将是真实的。否则返回 false。

【讨论】:

  • 这很聪明。你也可以选择你的答案和@Stefan 的建议string.scan(/^\d+$/).any? 的变体,我认为这读起来很好。
  • 对我来说,现在的答案更容易理解;)只是寻找非数字符号。如果没有 - 检查已通过。
【解决方案2】:
def check_string(str)
  str !~ /\D/
end

check_string '123'
  #=> true
check_string ''
  #=> true
check_string '1a2'
  #=> false

【讨论】:

    【解决方案3】:

    数字可以是负数,也可以是浮点数。因此,如果允许这些,请考虑以下解决方案:

    def is_numberic?(str)
        str == "#{str.to_f}" || str == "#{str.to_i}"
    end
    

    一些计算结果为真的输入

    pry(main)> is_numberic? '5'
    => true
    pry(main)> is_numberic? '58127721'
    => true
    pry(main)> is_numberic? '58127721.737673'
    => true
    pry(main)> is_numberic? '0'
    => true
    pry(main)> is_numberic? '1818'
    => true
    pry(main)> is_numberic? '0.1'
    => true
    pry(main)> is_numberic? '0.0'
    => true
    pry(main)> is_numberic? '11.29'
    => true
    pry(main)> is_numberic? '-0.12'
    => true
    pry(main)> is_numberic? '-29'
    => true
    

    计算结果为假的输入

    pry(main)> is_numberic? '10 years'
    => false
    pry(main)> is_numberic? '01'
    => false
    pry(main)> is_numberic? '00'
    => false
    pry(main)> is_numberic? '0.10'
    => false
    pry(main)> is_numberic? ''
    => false
    

    如您所见,有几种情况可能应该支持,例如'0.10',但不支持。在这种情况下,允许的输入是'0.1'

    【讨论】:

      【解决方案4】:

      这是我检测是否为浮点数的建议

      def check(string)
        scan = string.scan(/\D/)
        scan.size == 0 || (scan.size == 1 && scan.first == ".") # or "," depend on your separator
      end
      

      使用示例:

      check("123") => true
      check("12.3") => true
      check("12e3") => false
      check("12.3.2") => false
      

      【讨论】:

        【解决方案5】:

        你可以使用正则表达式:

        def check_string(string)
          raise 'Empty string passed' if string.empty?
        
          /\A\d+\z/ === string
        end
        
        check_string '123'
        #=> true
        check_string '0123'
        #=> true
        check_string '0'
        #=> true
        

        【讨论】:

        • 不适用于string = '0' - 为什么不简单地使用/^\d+$//\A\d+\z/
        • @Stefan /^\d+$/ 非常有意义!
        • @AndreyDeineko 这不符合字符串“foobar\n123”的前提,因为您的正则表达式在这里匹配。你实际上想使用/\A\d+\z/
        • 似乎这可以简化为 string =~ /\A\d+\z/ ? true : false 这可以处理所有情况,并且会在空字符串上返回 false,因为它不包含数字。
        【解决方案6】:

        我们也可以使用“匹配”功能来做到这一点。

        "1234".match(/\D/)
        #=> nil
        "1234foo".match(/\D/)
        #=> #<MatchData "f">
        

        match (String) - APIdock

        【讨论】:

          【解决方案7】:

          我认为我们应该使用正则表达式来找到它。

          it will work for the below scenarios
          "3.0"
          "av3"
          "3"
          

          is_numeric = false if option.option.match?(/[^0-9.]/)

          【讨论】:

            【解决方案8】:

            如果有人正在寻找另一种方法来确定字符串是否为数字 -> 是使用“is_a? Numeric”。 Is_a? reference documentation

            "namaste".is_a? Numeric
            => false
            
            6.is_a? Numeric
            => true
            
            str1 = "foo"
            str2 = 9
            
            str1.is_a? Numeric
            => false
            str2.is_a? Numeric
            => true
            

            你也可以使用:

            7.is_a?(Numeric)
            => true
            
            "too".is_a?(Numeric)
            => false
            

            基本上它是确定一个类是否是类对象的一种类型。我刚刚发现了这个,并认为我会分享。

            【讨论】:

            • 您的str2 不是字符串。用str2 = "9" 试试这个,看看它是否有效(它没有)。
            猜你喜欢
            • 2010-12-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-07
            • 2014-07-16
            • 1970-01-01
            • 2012-01-05
            相关资源
            最近更新 更多