함수가 필요합니다 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"
09
10
Integer
답변
하나의 라이너를 사용할 수 있습니다.
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
- 접두사가 붙지 않습니다
is_
. 내가 좋아하는,와 Questionmark 방법에 대한 그 바보 I을 찾아"04".integer?
더 나은보다 훨씬"foo".is_integer?
. - sepp2k의 합리적인 솔루션을 사용합니다
"01"
. - 객체 지향, 예.