How to find out if letter is Alphanumeric or Digit in Swift

后端 未结 4 474
攒了一身酷
攒了一身酷 2020-11-30 05:39

I want to count the number of letters, digits and special characters in the following string:

let phrase = \"The final score was 32-31!\"

I

相关标签:
4条回答
  • 2020-11-30 06:01

    I've created a short extension for letter and digits count for a String

    extension String {
      var letterCount : Int {
        return self.unicodeScalars.filter({ CharacterSet.letters.contains($0) }).count
      }
    
      var digitCount : Int {
       return self.unicodeScalars.filter({ CharacterSet.decimalDigits.contains($0) }).count
      }
    }
    

    or a function to get a count for any CharacterSet you put in

    extension String {    
      func characterCount(for set: CharacterSet) -> Int {
        return self.unicodeScalars.filter({ set.contains($0) }).count
      }
    }
    

    usage:

    let phrase = "the final score is 23-13!"
    let letterCount = phrase.characterCount(for: .letters)
    
    0 讨论(0)
  • 2020-11-30 06:02

    Use the values of unicodeScalars

    let phrase = "The final score was 32-31!"
    var letterCounter = 0, digitCounter = 0
    for scalar in phrase.unicodeScalars {
        let value = scalar.value
        if (value >= 65 && value <= 90) || (value >= 97 && value <= 122) {++letterCounter}
        if (value >= 48 && value <= 57) {++digitCounter}
    }
    println(letterCounter)
    println(digitCounter)
    
    0 讨论(0)
  • 2020-11-30 06:16

    For Swift 5 you can do the following for simple strings, but be vigilant about handling characters like "1️⃣" , "④" these would be treated as numbers as well.

    let phrase = "The final score was 32-31!"
    
    var numberOfDigits = 0;
    var numberOfLetters = 0;
    var numberOfSymbols = 0;
    
    phrase.forEach {
    
        if ($0.isNumber) {
            numberOfDigits += 1;
        }
        else if ($0.isLetter)  {
            numberOfLetters += 1
        }
        else if ($0.isSymbol || $0.isPunctuation || $0.isCurrencySymbol || $0.isMathSymbol) {
            numberOfSymbols += 1;
        }
    }
    
    print(#"\#(numberOfDigits)  || \#(numberOfLetters) || \#(numberOfSymbols)"#);
    
    0 讨论(0)
  • 2020-11-30 06:18

    For Swift 5 see rustylepord's answer.

    Update for Swift 3:

    let letters = CharacterSet.letters
    let digits = CharacterSet.decimalDigits
    
    var letterCount = 0
    var digitCount = 0
    
    for uni in phrase.unicodeScalars {
        if letters.contains(uni) {
            letterCount += 1
        } else if digits.contains(uni) {
            digitCount += 1
        }
    }
    

    (Previous answer for older Swift versions)

    A possible Swift solution:

    var letterCounter = 0
    var digitCount = 0
    let phrase = "The final score was 32-31!"
    for tempChar in phrase.unicodeScalars {
        if tempChar.isAlpha() {
            letterCounter++
        } else if tempChar.isDigit() {
            digitCount++
        }
    }
    

    Update: The above solution works only with characters in the ASCII character set, i.e. it does not recognize Ä, é or ø as letters. The following alternative solution uses NSCharacterSet from the Foundation framework, which can test characters based on their Unicode character classes:

    let letters = NSCharacterSet.letterCharacterSet()
    let digits = NSCharacterSet.decimalDigitCharacterSet()
    
    var letterCount = 0
    var digitCount = 0
    
    for uni in phrase.unicodeScalars {
        if letters.longCharacterIsMember(uni.value) {
            letterCount++
        } else if digits.longCharacterIsMember(uni.value) {
            digitCount++
        }
    }
    

    Update 2: As of Xcode 6 beta 4, the first solution does not work anymore, because the isAlpha() and related (ASCII-only) methods have been removed from Swift. The second solution still works.

    0 讨论(0)
提交回复
热议问题