Проверить, является ли строка в целом целым числом в кавычках, используя Ruby? - PullRequest
120 голосов
/ 06 августа 2009

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

"12".is_an_integer? returns true
"blah".is_an_integer? returns false

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

Ответы [ 20 ]

3 голосов
/ 21 декабря 2010
  def isint(str)
    return !!(str =~ /^[-+]?[1-9]([0-9]*)?$/)
  end
3 голосов
/ 15 июня 2011

лично мне нравится подход исключения, хотя я бы сделал его немного более кратким.

class String
  def integer?(str)
    !!Integer(str) rescue false
  end
end

Однако, как уже говорили другие, это не работает с октальными строками ...

2 голосов
/ 24 мая 2017

Решение:

# /initializers/string.rb
class String
  IntegerRegex = /^(\d)+$/

  def integer?
    !!self.match(IntegerRegex)
  end
end

# any_model_or_controller.rb
'12345'.integer? # true
'asd34'.integer? # false

Пояснение:

  • /^(\d)+$/ - это регулярное выражение выражение для поиска цифр в любой строке. Вы можете проверить свои выражения и результаты в http://rubular.com/.
  • Мы сохраняем его в константе IntegerRegex, чтобы избежать ненужного выделения памяти каждый раз, когда мы используем его в методе.
  • integer? - это вопросительный метод, который должен возвращать true или false.
  • match - это метод для строки, который соответствует вхождениям согласно заданному выражению регулярного выражения в аргументе и возвращает совпадающие значения или nil.
  • !! преобразует результат метода match в эквивалентное логическое значение.
  • И объявление метода в существующем классе String - это исправление обезьяны, которое ничего не меняет в существующих функциях String, а просто добавляет другой метод с именем integer? для любого объекта String.
2 голосов
/ 01 июня 2015

Может не подходить для всех случаев, но простой

"12".to_i   => 12
"blah".to_i => 0

может также подойти для некоторых.

Так что, если это число, а не 0, оно вернет число. Если он возвращает 0, это либо слово, либо 0.

2 голосов
/ 17 сентября 2013

Ruby 2.4 имеет Regexp#match?: (с ?)

def integer?(str)
  /\A[+-]?\d+\z/.match? str
end

Для более старых версий Ruby есть Regexp#===. И хотя в целом следует избегать прямого использования оператора равенства регистра, здесь он выглядит очень чисто:

def integer?(str)
  /\A[+-]?\d+\z/ === str
end

integer? "123"    # true
integer? "-123"   # true
integer? "+123"   # true

integer? "a123"   # false
integer? "123b"   # false
integer? "1\n2"   # false
1 голос
/ 15 июня 2016

Для более обобщенных случаев (включая числа с десятичной точкой), Вы можете попробовать следующий метод:

def number?(obj)
  obj = obj.to_s unless obj.is_a? String
  /\A[+-]?\d+(\.[\d]+)?\z/.match(obj)
end

Вы можете проверить этот метод в сеансе irb:

(irb)
>> number?(7)
=> #<MatchData "7" 1:nil>
>> !!number?(7)
=> true
>> number?(-Math::PI)
=> #<MatchData "-3.141592653589793" 1:".141592653589793">
>> !!number?(-Math::PI)
=> true
>> number?('hello world')
=> nil
>> !!number?('hello world')
=> false

Для подробного объяснения регулярного выражения здесь эта статья блога :)

0 голосов
/ 26 сентября 2014

Расширяя ответ @ rado выше, можно также использовать троичное выражение для принудительного возврата истинных или ложных логических значений без использования двойных ударов. Конечно, версия с двойным логическим отрицанием является более краткой, но, вероятно, труднее читать для новичков (таких как я).

class String
  def is_i?
     self =~ /\A[-+]?[0-9]+\z/ ? true : false
  end
end
0 голосов
/ 21 апреля 2016

Я не уверен, было ли это когда-то, когда задавался этот вопрос, но ... Для всех, кто сталкивается с этим постом, самый простой способ -

var = "12"
var.is_a?(Integer) # returns false
var.is_a?(String) # returns true

var = 12
var.is_a?(Integer) # returns true
var.is_a?(String) # returns false

.is_a? будет работать с любым объектом!

0 голосов
/ 23 марта 2016

Один вкладыш в string.rb

def is_integer?; true if Integer(self) rescue false end
0 голосов
/ 04 июля 2015

вы можете использовать is_a? метод. например 1.is_a? Целое число вернет true

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...