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
대부분은 다음과 같이 행동합니다.false
Ruby에서는 다음과 같은 정수를 쉽게 확인할 수 있습니다.
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
- 이 접두사는 다음과 같습니다.
is_
나는 물음표 방식에 바보 같은 것을 발견했다, 나는 좋아합니다."04".integer?
다 훨씬 더 ."foo".is_integer?
. - 그것은 sepp2k에 의한 합리적인 해결책을 사용합니다, 그것은 다음과 같습니다.
"01"
등등. - 물체 지향적이야, 야.
은 가장좋간단방다같습다니음과법은한고▁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
'programing' 카테고리의 다른 글
Spring Application Builder는 언제 사용합니까? (0) | 2023.06.22 |
---|---|
.NET에서 소수점, 부동소수점 및 이중점의 차이는 무엇입니까? (0) | 2023.06.02 |
문자열에서 하위 문자열 제거 (0) | 2023.06.02 |
스피너 선택 항목 텍스트를 가져오시겠습니까? (0) | 2023.06.02 |
왜 Ruby는 개인적인 방법과 보호된 방법을 모두 가지고 있습니까? (0) | 2023.06.02 |