programing

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

firstcheck 2023. 6. 2. 22:48
반응형

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

이 필요해요, ㅠㅠㅠㅠㅠㅠㅠis_an_integer, 디에어

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

루비에서 어떻게 해야 하나요?regex를 작성하고 싶지만 제가 모르는 도우미가 있을 것 같습니다.

자, 여기 쉬운 방법이 있습니다.

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

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

사용할 수 있습니다.Integer(str)상승하는지 확인합니다.

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

이는 다음과 같은 경우에 사실로 돌아온다는 점을 지적해야 합니다."01"에 적합하지 않습니다."09" 문에때 09올바른 정수 리터럴이 아닙니다.원하는 행동이 아니라면 추가할 수 있습니다.10 주서로으장의 두 Integer그래서 그 숫자는 항상 기본 10으로 해석됩니다.

Ruby 2.6.0은 예외를 발생시키지 않고 정수로 캐스팅할 수 있으며 반환됩니다.nil캐스팅이 실패하면,그리고 그 이후로nil대부분은 다음과 같이 행동합니다.falseRuby에서는 다음과 같은 정수를 쉽게 확인할 수 있습니다.

if Integer(my_var, exception: false)
  # do something if my_var can be cast to an integer
end
"12".match(/^(\d)+$/)      # true
"1.2".match(/^(\d)+$/)     # false
"dfs2".match(/^(\d)+$/)    # false
"13422".match(/^(\d)+$/)   # true

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

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

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

아니 심지어는

int = Integer(str) rescue false

수행하려는 작업에 따라 rescue 절이 있는 시작 엔드 블록을 직접 사용할 수도 마찬가지입니다.

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

  i.times do |j|
    puts j
  end
rescue ArgumentError
  puts "Not an int, doing something else"
end
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. 물체 지향적이야, 야.

은 가장좋간단방다같습다니음과법은한고▁is다를 사용하는 것입니다.Float

val = Float "234" rescue nil

Float "234" rescue nil #=> 234.0

Float "abc" rescue nil #=> nil

Float "234abc" rescue nil #=> nil

Float nil rescue nil #=> nil

Float "" rescue nil #=> nil

Integer또한 좋지만 돌아올 것입니다.0위해서Integer nil

선호하는 항목:

config/initializers/string.message

class String
  def number?
    Integer(self).is_a?(Integer)
  rescue ArgumentError, TypeError
    false
  end
end

다음과 같은 경우:

[218] pry(main)> "123123123".number?
=> true
[220] pry(main)> "123 123 123".gsub(/ /, '').number?
=> true
[222] pry(main)> "123 123 123".number?
=> false

또는 전화 번호를 확인합니다.

"+34 123 456 789 2".gsub(/ /, '').number?

훨씬 더 간단한 방법은

/(\D+)/.match('1221').nil? #=> true
/(\D+)/.match('1a221').nil? #=> false
/(\D+)/.match('01221').nil? #=> true

개인적으로 저는 조금 더 간결하게 만들겠지만 예외적인 접근 방식을 좋아합니다.

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

하지만 다른 사람들이 이미 말했듯이, 이것은 Octal 문자열에서는 작동하지 않습니다.

이는 단순히 다음을 사용하는 모든 경우에 적합하지 않을 수 있습니다.

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

어떤 사람들에게도 도움이 될 수 있습니다.

숫자가 0이 아닌 경우 숫자를 반환합니다.0을 반환하면 문자열이거나 0입니다.

  def isint(str)
    return !!(str =~ /^[-+]?[1-9]([0-9]*)?$/)
  end

제 솔루션은 다음과 같습니다.

# /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클래스는 원숭이 패치로, 기존 문자열 기능에서 아무것도 변경하지 않고 이름이 붙은 다른 메서드만 추가합니다.integer?모든 String 개체에 있습니다.

루비 2.4에는 다음이 있습니다.?)

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

이전 버전의 Ruby의 경우, 가 있습니다. 그리고 일반적으로 대소문자 구분 연산자를 직접 사용하는 것은 피해야 하지만 여기서는 매우 깨끗해 보입니다.

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

위에서 @rado의 답변을 확장하면 3차 진술을 사용하여 이중 앞머리를 사용하지 않고 참 또는 거짓 불리언을 강제로 반환할 수 있습니다.물론 이중 논리적 부정 버전은 더 간결하지만 (나와 같은) 새로 온 사람들에게는 읽기가 더 어려울 것입니다.

class String
  def is_i?
     self =~ /\A[-+]?[0-9]+\z/ ? true : false
  end
end

더 일반화된 경우(소수점이 있는 숫자 포함)에는 다음 방법을 사용할 수 있습니다.

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

여기에 관련된 정규식에 대한 자세한 설명은 이 블로그 기사를 참조하십시오:)

라이너 1개string.rb

def is_integer?; true if Integer(self) rescue false end

저는 이 질문이 이 질문에 대한 것이었는지는 잘 모르겠지만, 이 게시물을 건너는 사람들에게 가장 간단한 방법은 다음과 같습니다.

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?모든 개체와 함께 작동합니다.

언급URL : https://stackoverflow.com/questions/1235863/how-to-test-if-a-string-is-basically-an-integer-in-quotes-using-ruby

반응형