변수가 정수인지 확인


137

Rails 3 또는 Ruby에는 변수가 정수인지 확인하는 기본 제공 방법이 있습니까?

예를 들어

1.is_an_int #=> true
"dadadad@asdasd.net".is_an_int #=> false?


1
변수가 정수인지 걱정하지 말고 변수가에 반응하는지 확인해야합니다 to_i. 그것은 루비의 "오리 타자"의 일부입니다. 정수처럼 행동 할 수 있다면, 마치 하나처럼 취급하십시오.
Tin Man

4
@ The Tin Man : 전부는 아닙니다. "hello".to_i는 0을 반환하지만 예상과 다를 수 있습니다.
EinLama

1
@AnApprentice 귀하의 정보 kind_of?는에 대한 별칭 is_a?입니다.
Jacob Relkin

3
@JacobRelkin is_a?은 약간 다릅니다. 특정 클래스의 인스턴스 객체가 있는지 묻습니다. kind_of?특정 클래스의 인스턴스인지 또는 하위인지 묻습니다. fido.is_a? Dog사실이다; fido.kind_of? Animal예를 들어
Tom Harrison

답변:


274

당신은 is_a?방법을 사용할 수 있습니다

>> 1.is_a? Integer
=> true
>> "dadadad@asdasd.net".is_a? Integer
=> false
>> nil.is_a? Integer
=> false

2
정말 멋지다. 이메일 주소의 유효성을 검사합니까?
AnApprentice

65
@AnApprentice 이메일 주소의 유효성 검사는 언제부터 질문의 일부입니까?
Jacob Relkin

4
숫자가 "11111111"과 같은 문자열 인 경우에는 작동하지 않습니다.
Ricbermo

아래를보십시오 Integer(obj) rescue false
.

4
@Ricbermo "1111111"은 문자열입니다. 정수로 변환 할 수있는 문자열입니다.
Sqeaky

50

당신은 객체가 있는지 여부를 알고 싶은 경우에 Integer 의미있는 정수로 변환 할 수 있습니다 또는 뭔가 (같은 것들을 포함하지 "hello"하는 to_i에 변환됩니다 0)

result = Integer(obj) rescue false

2
어쩌면 나는 멍청한 놈이지만이 조정은 나를 도왔을 것입니다. 결과 = 정수 (obj) 복구 거짓.
John Curry

@JohnCurry, 답변을 개선 할 수 있다면 자유롭게 수정하십시오. 그렇게 작동합니다.
Alex D

2
나는 거절 당했다. "이 수정 사항은 게시물의 원래 의도와 다릅니다."그러나 귀하의 답변에 감사드립니다. 문제를 해결하는 데 도움이되었습니다.
John Curry

7
문자열이 8 진수로 해석되어 Integer ('08 ')가 실패하고 Integer ('08', 10)가 제대로 작동합니다. 만일을 위해서.
Jong Jong Lee

1
Integer(2.5) => 2항상 의미있는 전환 인지 확실하지 않습니다 .
mkataja

29

문자열에 정규식을 사용하십시오.

def is_numeric?(obj) 
   obj.to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? false : true
end

변수가 특정 유형인지 확인하려면 kind_of?다음을 사용하면됩니다 .

1.kind_of? Integer #true
(1.5).kind_of? Float #true
is_numeric? "545"  #true
is_numeric? "2aa"  #false

이것은 내가 is_numeric을 찾는 것이 정확히 무엇입니까?
workdreamer

나는 이것이 가깝지 만 정확하게 정확하지 않다고 생각합니다. 예를 들어 ".34"에 실패합니다. 문제는, 제가 생각하기에 있다는 것입니다 지정 아닌 욕심 일치, 당신 반면 아마 옵션 일치합니다. 변경 하는 것은 문제를 해결할 수 있지만 내가 확인하기 위해 일련의 테스트를 통해 실행하려는 것입니다. 이것은 16 진수 또는 지수 표기법과도 일치하지 않지만 특정 사용 사례에는 적합합니다. \d+??\d+?\d*
Jeff

1
왜 그냥이 정규 표현식을 사용하려면 \A\d+\z?
NARKOZ

1
Integer(obj) rescue false아래 @ alex-d 의 코드와 비교하십시오 . 정규 표현식을 읽기가 어렵고 의도가 명확하지 않습니다. 두 작품은, 난 항상 :-) 작동하지 않는 잘못 구성된 정규 표현식 수정하는 동안이 질문에 온
톰 해리슨

17

변수의 유형이 확실하지 않은 경우 (숫자 문자열 일 수 있음) 매개 변수에 전달 된 신용 카드 번호라고 말하면 원래 문자열이지만 문자열이 아닌지 확인하려고합니다. t 안에 문자가 있으면이 방법을 사용합니다.

    def is_number?(obj)
        obj.to_s == obj.to_i.to_s
    end

    is_number? "123fh" # false
    is_number? "12345" # true

@Benny는이 방법에 대한 감독을 지적합니다.

is_number? "01" # false. oops!

고마워, 당신은 내 하루를 저장합니다. 플로팅 여부를 확인 해야하는 사람 obj.to_s == obj.to_f.to_s은 내 경우처럼 직접 변경할 수 있습니다 .
ksugiarto

영리한 에드먼드! 🙌
siwalikm

굉장히 Integer ( '123fh')와 구조 예외보다 이것을 선호합니다.
zw963

6

triple equal을 사용할 수 있습니다.

if Integer === 21 
    puts "21 is Integer"
end

5

있습니다 var.is_a? Class(귀하의 경우 :) var.is_a? Integer; 청구서에 맞을 수도 있습니다. 또는 Integer(var)구문 분석 할 수없는 경우 예외가 발생하는 곳이 있습니다.


3

더 "오리지널 타이핑"방식은 respond_to?이 방식 을 사용 하는 것입니다. "정수형"또는 "문자열 형"클래스도 사용할 수 있습니다.

if(s.respond_to?(:match) && s.match(".com")){
  puts "It's a .com"
else
  puts "It's not"
end

2

경우 당신은 내가 방법을 찾아, 0 값을 변환 할 필요가 없습니다 to_i그리고 to_f그들 중 제로 값 (있는 경우 전환 또는 0이 아닌) 또는 실제 문자열로 변환하기 때문에 매우 유용하게 Integer또는 Float값입니다.

"0014.56".to_i # => 14
"0014.56".to_f # => 14.56
"0.0".to_f # => 0.0
"not_an_int".to_f # 0
"not_a_float".to_f # 0.0

"0014.56".to_f ? "I'm a float" : "I'm not a float or the 0.0 float" 
# => I'm a float
"not a float" ? "I'm a float" : "I'm not a float or the 0.0 float" 
# => "I'm not a float or the 0.0 float"

EDIT2 : 조심하십시오. 0정수 값이 거짓이 아닙니다. 정확합니다 ( !!0 #=> true) (@prettycoder 덕분에)

편집하다

아, 방금 어두운 사건에 대해 알아 냈지만 숫자가 첫 번째 위치에있는 경우에만 발생하는 것 같습니다

"12blah".to_i => 12

루비는 0입니다!
prettycoder

1
@prettycoder는 머리 위로 주셔서 감사합니다, 나는 대답에 즉시 이것을 해결합니다
Cyril Duchon-Doris

1

개선을 사용하여 Alex D의 답변 을 활용하려면 다음을 수행 하십시오 .

module CoreExtensions
  module Integerable
    refine String do
      def integer?
        Integer(self)
      rescue ArgumentError
        false
      else
        true
      end
    end
  end
end

나중에 수업 시간에 :

require 'core_ext/string/integerable'

class MyClass
  using CoreExtensions::Integerable

  def method
    'my_string'.integer?
  end
end

0

무언가가 문자열인지 또는 어떤 종류의 숫자인지 확인하려고 시도하기 전에 비슷한 문제가있었습니다. 정규 표현식을 사용해 보았지만 사용 사례에 신뢰할 수 없습니다. 대신 변수 클래스를 확인하여 변수 클래스의 하위 항목인지 확인할 수 있습니다.

if column.class < Numeric
  number_to_currency(column)
else
  column.html_safe
end

이 상황에서는 BigDecimal, Date :: Infinity, Integer, Fixnum, Float, Bignum, Rational, Complex와 같은 숫자 자손을 대체 할 수도 있습니다.


-1

아마도 당신은 다음과 같은 것을 찾고있을 것입니다 :

"2.0 또는 2.0을 INT로 수락하지만 2.1 및"2.1 "은 거부

숫자 = 2.0

num.is_a이면? 문자열 num = Float (num) rescue false end

new_num = 정수 (num) 구조 false

숫자를 넣다

new_num을 넣습니다.

num == new_num을 넣습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.