Filter non-digits from string

后端 未结 12 1109
日久生厌
日久生厌 2020-12-01 11:36

Using only swift code I cant figure out how to take \"(555) 555-5555\" and return only the numeric values and get \"5555555555\". I need to remove all the parentheses, whit

相关标签:
12条回答
  • 2020-12-01 12:23

    I like regular expressions:

    var s = "(555) 555-5555"
    s = s.stringByReplacingOccurrencesOfString(
        "\\D", withString: "", options: .RegularExpressionSearch, 
        range: s.startIndex..<s.endIndex)
    
    0 讨论(0)
  • 2020-12-01 12:23

    Here is @Tapani Swift 3.2 solution

    let phno = contact.phoneNumbers[0].phoneNumber
    let strarr = phno.components(separatedBy: NSCharacterSet.decimalDigits.inverted)
    let newString = NSArray(array: strarr).componentsJoined(by: "")
    print(newString)
    
    0 讨论(0)
  • 2020-12-01 12:23

    I found the best solution with filter function. Please have a look into it.

    let string = "(555) 555-5555"
    
    let onlyDigits = string.filter({ (char) -> Bool in
    
        if Int("\(char)") != nil {
    
            return true
        }
        else {
    
            return false
        }
    
    })
    
    0 讨论(0)
  • 2020-12-01 12:31

    Details

    • Xcode Version 10.2.1 (10E1001), Swift 5

    Solution

    import Foundation
    
    extension String {
    
        private func filterCharacters(unicodeScalarsFilter closure: (UnicodeScalar) -> Bool) -> String {
            return String(String.UnicodeScalarView(unicodeScalars.filter { closure($0) }))
        }
    
        private func filterCharacters(definedIn charSets: [CharacterSet], unicodeScalarsFilter: (CharacterSet, UnicodeScalar) -> Bool) -> String {
            if charSets.isEmpty { return self }
            let charSet = charSets.reduce(CharacterSet()) { return $0.union($1) }
            return filterCharacters { unicodeScalarsFilter(charSet, $0) }
        }
    
        func removeCharacters(charSets: [CharacterSet]) -> String { return filterCharacters(definedIn: charSets) { !$0.contains($1) } }
        func removeCharacters(charSet: CharacterSet) -> String { return removeCharacters(charSets: [charSet]) }
    
        func onlyCharacters(charSets: [CharacterSet]) -> String { return filterCharacters(definedIn: charSets) { $0.contains($1) } }
        func onlyCharacters(charSet: CharacterSet) -> String { return onlyCharacters(charSets: [charSet]) }
    }
    

    Usage

    let string = "23f45gdor#@%#i425v wer 24 1+DWEJwi 3u09ru49w*()9uE2R_)$I#Q)_ U383q04+RFJO{dgnkvlj b`kefl;nwdl qsa`WKFSA,.E"
    print("original string:                                 \(string)")
    print("only .decimalDigits:                             \(string.onlyCharacters(charSet: .decimalDigits))")
    print("only [.lowercaseLetters, .symbols]:              \(string.onlyCharacters(charSets: [.lowercaseLetters, .symbols]))")
    print("remove .letters:                                 \(string.removeCharacters(charSet: .letters))")
    print("remove [.decimalDigits, .lowercaseLetters]:      \(string.removeCharacters(charSets: [.decimalDigits, .lowercaseLetters]))")
    

    Result

    original string:                                 23f45gdor#@%#i425v wer 24 1+DWEJwi 3u09ru49w*()9uE2R_)$I#Q)_ U383q04+RFJO{dgnkvlj b`kefl;nwdl qsa`WKFSA,.E
    only .decimalDigits:                             2345425241309499238304
    only [.lowercaseLetters, .symbols]:              fgdorivwer+wiuruwu$q+dgnkvljb`keflnwdlqsa`
    remove .letters:                                 2345#@%#425  24 1+ 30949*()92_)$#)_ 38304+{ `; `,.
    remove [.decimalDigits, .lowercaseLetters]:      #@%#   +DWEJ *()ER_)$I#Q)_ U+RFJO{ `; `WKFSA,.E
    

    (Optional) String extension

    extension String {
        var onlyDigits: String { return onlyCharacters(charSets: [.decimalDigits]) }
        var onlyLetters: String { return onlyCharacters(charSets: [.letters]) }
    }
    

    (Optional) String extension usage

    let string = "23f45gdor#@%#i425v wer 24 1+DWEJwi 3u09ru49w*()9uE2R_)$I#Q)_ U383q04+RFJO{dgnkvlj b`kefl;nwdl qsa`WKFSA,.E"
    print("original string:     \(string)")
    print(".onlyDigits:         \(string.onlyDigits)")
    print(".onlyLetters:        \(string.onlyLetters)")
    

    (Optional) String extension usage result

    original string:     23f45gdor#@%#i425v wer 24 1+DWEJwi 3u09ru49w*()9uE2R_)$I#Q)_ U383q04+RFJO{dgnkvlj b`kefl;nwdl qsa`WKFSA,.E
    .onlyDigits:         2345425241309499238304
    .onlyLetters:        fgdorivwerDWEJwiuruwuERIQUqRFJOdgnkvljbkeflnwdlqsaWKFSAE
    
    0 讨论(0)
  • 2020-12-01 12:34

    Split the string by non-digit characters to an array of digits and the join them back to a string:

    Swift 1:

    let stringArray = origString.componentsSeparatedByCharactersInSet(
        NSCharacterSet.decimalDigitCharacterSet().invertedSet)
    let newString = NSArray(array: stringArray).componentsJoinedByString("")
    

    Swift 2:

    let stringArray = origString.componentsSeparatedByCharactersInSet(
        NSCharacterSet.decimalDigitCharacterSet().invertedSet)
    let newString = stringArray.joinWithSeparator("")
    

    Swift 3 & 4:

    let newString = origString
        .components(separatedBy:CharacterSet.decimalDigits.inverted)
        .joined()
    
    0 讨论(0)
  • 2020-12-01 12:34

    Here is @Tapani's Swift 2.0 answer as a handy String extension, (length property is not part of solution but I left it in example because it is also handy):

    import Foundation
    
    extension String {
    
        var length : Int {
            return self.characters.count
        }
    
        func digitsOnly() -> String{
            let stringArray = self.componentsSeparatedByCharactersInSet(
                NSCharacterSet.decimalDigitCharacterSet().invertedSet)
            let newString = stringArray.joinWithSeparator("")
    
            return newString
        }
    
    }
    

    Usage:

    let phone = "(123)-123 - 1234"
    print(phone.digitsOnly())
    
    0 讨论(0)
提交回复
热议问题