Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 숫자로 이루어진 문자열인지 판별하는 방법 (CharacterSet, regularExpression, +benchmark) 본문

iOS 응용 (swift)

[iOS - swift] 숫자로 이루어진 문자열인지 판별하는 방법 (CharacterSet, regularExpression, +benchmark)

jake-kim 2023. 9. 15. 01:03

숫자로 이루어진 문자열 판별

  • 목표 - isNumber이라는 String의 extension으로 computed property를 정의하는 것
"123".isNumber // true
"123.456".isNumber // false
  • CharacterSet을 이용한 방법
extension String {
    var isNumberByCharacterSet: Bool {
        let digitsCharacters = CharacterSet(charactersIn: "0123456789")
        return CharacterSet(charactersIn: self).isSubset(of: digitsCharacters)
    }
}
  • regularExpression을 이용한 방법
extension String {
    var isNumberByRegularExpression: Bool {
        range(
            of: "^[0-9]*$",
            options: .regularExpression
        ) != nil
    }
}

(사용)

print("123".isNumberByCharacterSet) // true
print("123.456".isNumberByCharacterSet) // false
print("123".isNumberByRegularExpression) // true
print("123.456".isNumberByRegularExpression) // fales
  • 이 둘중에 더욱 속도가 빠른 것을 benchmark를 통해 아래에서 계속 알아보기

benchmark 준비

  • 빌드하여 벤치마크 결과 확인 
running isNumberByCharacterSet... done! (117507.45 ms)
running isNumberByRegularExpression... done! (65138.43 ms)

name                        time               std        iterations
--------------------------------------------------------------------
isNumberByCharacterSet      39267593708.000 ns ±   0.01 %          2
isNumberByRegularExpression 21725841500.500 ns ±   0.72 %          2

결과

  • 문자열로된 숫자를 판별할 때 ChracterSet을 사용한 것보다 regularExpression을 사용하는 방식이 더욱 효율적이므로 regularExpression을 사용할 것
extension String {
    var isNumberByRegularExpression: Bool {
        range(
            of: "^[0-9]*$",
            options: .regularExpression
        ) != nil
    }
}

* 전체 코드: https://github.com/JK0369/ExCheckNumber

* 참고

https://sarunw.com/posts/how-to-check-if-string-is-number-in-swift/

https://github.com/google/swift-benchmark

Comments