110 votes

Supprimer tous les caractères non numériques d'une chaîne dans swift

J'ai le besoin d'analyser certaines données inconnues qui devrait juste être une valeur numérique, mais peut contenir d'espaces ou d'autres caractères non alphanumériques.

Est-il une nouvelle façon de faire cela dans swift 2.0? Tout ce que je peux trouver en ligne semble être le vieux C façon de faire les choses.

Je suis en train de regarder stringByTrimmingCharactersInSet - comme je suis sûr que mes entrées seulement espaces/caractères spéciaux au début ou à la fin de la chaîne. Y a-construit dans les jeux de caractères que je peux utiliser pour cela? Ou dois-je créer mon propre?

J'espérais qu'il y aurait quelque chose comme stringFromCharactersInSet() qui me permettrait de spécifier des caractères valides uniquement pour garder

231voto

Rob Points 70987

J'espérais qu'il y aurait quelque chose comme stringFromCharactersInSet() qui me permettrait de spécifier des caractères valides uniquement pour les garder.

Vous pouvez soit utiliser trimmingCharacters avec l' inverted jeu de caractères à supprimer des caractères à partir du début ou de la fin de la chaîne. Dans Swift 3:

let result = string.trimmingCharacters(in: CharacterSet(charactersIn: "01234567890.").inverted)

Ou, dans Swift 2:

let result = string.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "0123456789.").invertedSet)

Ou, si vous voulez supprimer des caractères non numériques n'importe où dans la chaîne (et pas seulement au début ou à la fin), vous pouvez filter le characters:

let result = String(string.characters.filter { "01234567890.".characters.contains($0) })

Ou, si vous voulez seulement de match de chaînes valides d'un certain format (par exemple,####.##), vous pourriez utiliser une expression régulière. Par exemple, dans Swift 3:

if let range = string.range(of: "\\d+(\\.\\d*)?", options: .regularExpression) {
    let result = string.substring(with: range)
}

Ou Swift 2:

if let range = string.rangeOfString("\\d+(\\.\\d*)?", options: .RegularExpressionSearch) {
    let result = string.substringWithRange(range)
}

Le comportement de ces différentes approches diffèrent légèrement de sorte qu'il dépend juste exactement ce que vous essayez de faire. Inclure ou exclure le point décimal si vous voulez des nombres décimaux, ou tout simplement des entiers. Il y a beaucoup de façons de le faire.

47voto

Tom Howard Points 103
 let result = string.stringByReplacingOccurrencesOfString("[^0-9]", withString: "", options: NSStringCompareOptions.RegularExpressionSearch, range:nil).stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
 

Swift 3

 let result = string.replacingOccurrences( of:"[^0-9]", with: "", options: .regularExpression)
 

Vous pouvez upvote cette réponse .

33voto

Jake Cronin Points 375

Je préfère cette solution car j'aime les extensions et cela me semble un peu plus propre. Solution reproduite ici:

 extension String {
    var digits: String {
        return components(separatedBy: CharacterSet.decimalDigits.inverted)
            .joined()
    }
}
 

18voto

Aashish Points 1113

Swift 4

J'ai trouvé un moyen décent d' obtenir uniquement des caractères alphanumériques à partir d'une chaîne. Par exemple:-

 func getAlphaNumericValue() {

    var yourString  = "123456789!@#$%^&*()AnyThingYouWant"

    let unsafeChars = CharacterSet.alphanumerics.inverted  // Remove the .inverted to get the opposite result.  

    let cleanChars  = yourString.components(separatedBy: unsafeChars).joined(separator: "")


    print(cleanChars)  // 123456789AnyThingYouWant

}
 

12voto

vadian Points 29149

Une solution utilisant les fonctions filter et rangeOfCharacterFromSet

 let string = "sld [f]34é7*˜µ"

let alphaNumericCharacterSet = NSCharacterSet.alphanumericCharacterSet()
let filteredCharacters = string.characters.filter {
  return  String($0).rangeOfCharacterFromSet(alphaNumericCharacterSet) != nil
}
let filteredString = String(filteredCharacters) // -> sldf34é7µ
 

Pour filtrer uniquement les caractères numériques, utilisez

 let string = "sld [f]34é7*˜µ"

let numericSet = "0123456789"
let filteredCharacters = string.characters.filter {
  return numericSet.containsString(String($0))
}
let filteredString = String(filteredCharacters) // -> 347
 

ou

 let numericSet : [Character] = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
let filteredCharacters = string.characters.filter {
  return numericSet.contains($0)
}
let filteredString = String(filteredCharacters) // -> 347
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X