Как протестировать, если строка является в основном целым числом в кавычках с помощью Ruby

Мне нужна функция, is_an_integer, где

  • "12".is_an_integer? возвращает true.
  • "blah".is_an_integer? возвращает false.

Как я могу сделать это в Ruby? Я записал бы regex, но я предполагаю, что существует помощник для этого, что я не знаю.

126
задан the Tin Man 14 July 2019 в 23:00
поделиться

5 ответов

Вы можете использовать регулярные выражения. Вот функция с предложениями @janm.

class String
    def is_i?
       !!(self =~ /\A[-+]?[0-9]+\z/)
    end
end

Отредактированная версия в соответствии с комментарием от @wich:

class String
    def is_i?
       /\A[-+]?\d+\z/ === self
    end
end

Если вам нужно проверять только положительные числа

  if !/\A\d+\z/.match(string_to_check)
      #Is not a positive number
  else
      #Is all good ..continue
  end  
132
ответ дан 24 November 2019 в 00:48
поделиться
class String
  def integer?
    Integer(self)
    return true
  rescue ArgumentError
    return false
  end
end
  1. Он не имеет префикса is_ . Я нахожу это глупым в методах вопросительного знака, мне нравится "04" .integer? намного лучше, чем "foo" .is_integer? .
  2. Он использует разумное решение от sepp2k, который проходит для "01" и т. д.
  3. Объектно-ориентированный, ура.
8
ответ дан 24 November 2019 в 00:48
поделиться

Вы можете использовать однострочник:

str = ...
int = Integer(str) rescue nil

if int
  int.times {|i| p i}
end

или даже

int = Integer(str) rescue false

В зависимости от того, что вы пытаетесь сделать, вы также можете напрямую использовать начальный конечный блок с предложением восстановления:

begin
  str = ...
  i = Integer(str)

  i.times do |j|
    puts j
  end
rescue ArgumentError
  puts "Not an int, doing something else"
end
23
ответ дан 24 November 2019 в 00:48
поделиться

Вот простой способ:

class String
  def is_integer?
    self.to_i.to_s == self
  end
end

>> "12".is_integer?
=> true
>> "blah".is_integer?
=> false

Я не согласен с решениями, которые вызывают исключение для преобразования строки - исключения не являются потоком управления, и вы также можете сделать это правильно. Тем не менее, мое вышеприведенное решение не касается целых чисел, отличных от десятичной. Итак, вот способ обойтись, не прибегая к исключениям:

  class String
    def integer? 
      [                          # In descending order of likeliness:
        /^[-+]?[1-9]([0-9]*)?$/, # decimal
        /^0[0-7]+$/,             # octal
        /^0x[0-9A-Fa-f]+$/,      # hexadecimal
        /^0b[01]+$/              # binary
      ].each do |match_pattern|
        return true if self =~ match_pattern
      end
      return false
    end
  end
158
ответ дан 24 November 2019 в 00:48
поделиться

Вы можете использовать Integer (str) и посмотреть, повысится ли оно:

def is_num?(str)
  !!Integer(str)
rescue ArgumentError, TypeError
  false
end

Следует отметить, что пока это возвращает верно для «01» , но не для «09» просто потому, что 09 не будет допустимым целочисленным литералом. Если это не то поведение, которое вам нужно, вы можете добавить 10 в качестве второго аргумента к Integer , чтобы число всегда интерпретировалось как основание 10.

64
ответ дан 24 November 2019 в 00:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: