[ruby] Ruby를 사용하여 문자열이 기본적으로 따옴표로 묶인 정수인지 테스트하는 방법

함수가 필요합니다 is_an_integer.

  • "12".is_an_integer? true를 반환합니다.
  • "blah".is_an_integer? false를 반환합니다.

루비에서 어떻게해야합니까? 나는 정규 표현식을 작성하지만 내가 알지 못하는 도우미가 있다고 가정합니다.



답변

정규식을 사용할 수 있습니다. 다음은 @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  


답변

다음은 쉬운 방법입니다.

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

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

문자열을 변환하기 위해 예외를 유발하는 솔루션에 동의하지 않습니다. 예외는 제어 흐름이 아니며 올바른 방법으로 수행 할 수도 있습니다. 즉, 위의 솔루션은 10이 아닌 정수를 처리하지 않습니다. 따라서 예외에 의지하지 않고 할 수있는 방법이 있습니다.

  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


답변

사용 Integer(str)하고 발생하는지 확인할 수 있습니다 .

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

이것은에 대해 true를 반환하지만 , 유효한 정수 리터럴이 아니기 때문에에 "01"대해 true를 반환 하지 않습니다 . 이것이 원하는 동작이 아닌 경우 에 두 번째 인수로 추가 할 수 있으므로 숫자는 항상 기본 10으로 해석됩니다."09"0910Integer


답변

하나의 라이너를 사용할 수 있습니다.

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

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

또는

int = Integer(str) rescue false

수행하려는 작업에 따라 rescue 절과 함께 begin end block을 직접 사용할 수도 있습니다.

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

  i.times do |j|
    puts j
  end
rescue ArgumentError
  puts "Not an int, doing something else"
end


답변

"12".match(/^(\d)+$/)      # true
"1.2".match(/^(\d)+$/)     # false
"dfs2".match(/^(\d)+$/)    # false
"13422".match(/^(\d)+$/)   # true


답변

Ruby 2.6.0 에서는 예외를 발생시키지 않고 정수로nil 캐스트 할 수 있으며 캐스트가 실패하면 리턴 됩니다. 그리고 nil대부분 false루비 처럼 동작 하기 때문에 다음과 같이 쉽게 정수를 확인할 수 있습니다 :

if Integer(my_var, exception: false)
  # do something if my_var can be cast to an integer
end


답변

class String
  def integer?
    Integer(self)
    return true
  rescue ArgumentError
    return false
  end
end
  1. 접두사가 붙지 않습니다 is_. 내가 좋아하는,와 Questionmark 방법에 대한 그 바보 I을 찾아 "04".integer?더 나은보다 훨씬 "foo".is_integer?.
  2. sepp2k의 합리적인 솔루션을 사용합니다 "01".
  3. 객체 지향, 예.