Diviser une NSString pour accéder à un morceau particulier

142

J'ai une chaîne comme celle-ci: @"10/04/2011"et je veux enregistrer uniquement le "10" dans une autre chaîne. Comment puis je faire ça?

faire du vélo
la source
1
La meilleure solution serait d'utiliser NSDate et NSDateFormatter. Crédit supplémentaire et code de meilleure qualité si vous le localisez réellement dans le système pour peut-être faire face aux différences mois / jour jour / mois.
EricLeaf
@EricLeaf où dans la question dit-il que la chaîne est une date?
JeremyP

Réponses:

376
NSArray* foo = [@"10/04/2011" componentsSeparatedByString: @"/"];
NSString* firstBit = [foo objectAtIndex: 0];

Mise à jour du 03/07/2018:

Maintenant que la question a acquis une balise Swift, je devrais ajouter la manière Swift de le faire. C'est à peu près aussi simple:

let substrings = "10/04/2011".split(separator: "/")
let firstBit = substrings[0]

Notez bien que cela vous donne un tableau de fichiers Substring. Si vous avez besoin de les reconvertir en chaînes ordinaires, utilisezmap

let strings = "10/04/2011".split(separator: "/").map{ String($0) }
let firstBit = strings[0]

ou

let firstBit = String(substrings[0])
JeremyP
la source
1
L'utilisation [foo firstObject]pourrait être meilleure dans le cas général car elle gérera également correctement les tableaux vides.
Bobrovsky
2
@Bobrovsky dans le cas général, il serait préférable de valider la chaîne pour s'assurer qu'il s'agit d'une date. Ceci est juste un exemple qui répond à la question spécifique. Il est également plus généralisable d'obtenir l'une des trois parties de date.
JeremyP
Malgré les masses de votes positifs, je ne suis pas d'accord. Premièrement, pourquoi pensez-vous que le 10 est le jour au lieu du mois? Ce genre d'approche fausse est la raison pour laquelle nous avons eu le problème de l'an 2000.
EricLeaf
2
@EricLeaf La question dit "Je veux seulement enregistrer le 10 dans une chaîne". J'aurais pu appeler la variable n'importe quoi. La réponse est correcte pour la question. En fait, nulle part la question ne dit que c'est une date, j'ai donc modifié la réponse.
JeremyP
36

L'un ou l'autre de ces 2:

NSString *subString = [dateString subStringWithRange:NSMakeRange(0,2)];
NSString *subString = [[dateString componentsSeparatedByString:@"/"] objectAtIndex:0];

Cependant, gardez à l'esprit que parfois une chaîne de date n'est pas formatée correctement et qu'un jour (ou un mois d'ailleurs) est affiché comme 8, plutôt que 08, donc la première peut être la pire des 2 solutions.

Ce dernier doit être placé dans un tableau séparé afin que vous puissiez réellement vérifier la longueur de l'élément retourné, afin que vous n'obteniez aucune exception levée dans le cas d'une chaîne de date corrompue ou invalide de la source que vous avez.

Antwan van Houdt
la source
c'est correct, notez simplement que dans la méthode subStringWithRange, le deuxième «S» ne doit pas être «minuscule» (substringWithRange) ou vous obtiendrez une erreur comme «cette méthode n'existe pas».
Marcos Reboucas
9

Il fonctionne bien

NSString *dateString = @"10/10/2010";//Date 
NSArray* dateArray = [dateString componentsSeparatedByString: @"/"];
NSString* dayString = [dateArray objectAtIndex: 0];
VinukondaPraveen
la source
8

Objectif c:

     NSString *day = [@"10/04/2011" componentsSeparatedByString:@"/"][0];

Rapide:

     var day: String = "10/04/2011".componentsSeparatedByString("/")[0]
ll
la source
6

Utilisation [myString componentsSeparatedByString:@"/"]

Julio Gorgé
la source
5

J'ai formaté la belle solution fournie par JeremyP ci-dessus en une fonction réutilisable plus générique ci-dessous:

///Return an ARRAY containing the exploded chunk of strings
+(NSArray*)explodeString:(NSString*)stringToBeExploded WithDelimiter:(NSString*)delimiter
{
    return [stringToBeExploded componentsSeparatedByString: delimiter];
}
Khayrattee Wasseem
la source
5
Pourquoi ne pas simplement utiliser directement componentsSeparatedByString?
John Gibb
1
parce que je l'utilise dans plusieurs projets, donc si quelque chose change, je dois juste changer le corps de la fonction wrapper plutôt qu'à plusieurs endroits. Mais si vous ne l'utilisez qu'une fois, alors oui, il est plus logique de l'utiliser directement. Cheers!
Khayrattee Wasseem
3
componentsSeparatedByString n'a pas changé depuis environ deux décennies. Emballez-vous tous les appels de méthode Apple au cas où ils changeraient? Vous devez taper beaucoup.
tooluser
1

Version Swift 3.0

let arr = yourString.components(separatedBy: "/")
let month = arr[0]
Fangming
la source