Dividi una stringa NSS per accedere a un particolare pezzo


142

Ho una stringa come questa: @"10/04/2011"e voglio salvare solo il "10" in un'altra stringa. Come lo posso fare?


1
La soluzione migliore sarebbe utilizzare NSDate e NSDateFormatter. Credito extra e codice di migliore qualità se lo si localizza effettivamente nel sistema per gestire forse le differenze mese / giorno giorno / mese.
EricLeaf,

@EricLeaf dove nella domanda dice che la stringa è una data?
JeremyP,

Risposte:


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

Aggiornamento del 03/07/2018:

Ora che la domanda ha acquisito un tag Swift, dovrei aggiungere il modo Swift per farlo. È abbastanza semplice:

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

Anche se nota che ti dà una serie di Substring. Se è necessario riconvertirli in stringhe ordinarie, utilizzaremap

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

o

let firstBit = String(substrings[0])

1
L'uso [foo firstObject]potrebbe essere migliore in generale perché gestirà correttamente anche l'array vuoto.
Bobrovsky,

2
@Bobrovsky nel caso generale, sarebbe meglio convalidare la stringa per assicurarsi che sia una data. Questo è solo un esempio che risponde alla domanda specifica. È anche più generalizzabile ottenere una delle tre parti della data.
JeremyP,

Nonostante le masse di voti, non sono d'accordo. Primo, perché pensi che il 10 sia il giorno anziché il mese? Questo tipo di approccio sbagliato è il motivo per cui abbiamo avuto il problema Y2K.
EricLeaf,

2
@EricLeaf La domanda dice "Voglio solo salvare il 10 in una stringa". Avrei potuto chiamare la variabile qualunque cosa. La risposta è corretta per la domanda. In realtà, da nessuna parte la domanda dice che è una data, quindi ho modificato la risposta.
JeremyP,

36

Uno di questi 2:

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

Tuttavia, tieni presente che a volte una stringa di data non è formattata correttamente e un giorno (o un mese, per quella materia) viene mostrato come 8, anziché 08, quindi la prima potrebbe essere la peggiore delle 2 soluzioni.

Quest'ultimo dovrebbe essere inserito in un array separato in modo da poter effettivamente verificare la lunghezza della cosa restituita, in modo da non ricevere eccezioni nel caso di una stringa di data corrotta o non valida da qualsiasi fonte tu abbia.


è corretto, basta notare che nel metodo subStringWithRange la seconda "S" non dovrebbe essere "minuscola" (substringWithRange) o si otterrà un errore del tipo "questo metodo non esiste".
Marcos Reboucas,

9

Funziona benissimo

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

8

Objective-C:

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

Swift:

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


5

Ho formattato la bella soluzione fornita da JeremyP sopra in una funzione riutilizzabile più generica di seguito:

///Return an ARRAY containing the exploded chunk of strings
+(NSArray*)explodeString:(NSString*)stringToBeExploded WithDelimiter:(NSString*)delimiter
{
    return [stringToBeExploded componentsSeparatedByString: delimiter];
}

5
Perché non usare direttamente ComponentsSeparatedByString?
John Gibb,

1
perché lo sto usando in diversi progetti, quindi se qualcosa cambia, devo solo cambiare il corpo della funzione wrapper invece che in diversi punti. Ma se lo stai usando solo una volta, quindi sì, ha più senso usarlo direttamente Saluti!
Khayrattee Wasseem il

3
componentiSeparatedByString non è cambiato in qualcosa come due decenni. Avvolgi tutte le chiamate al metodo Apple nel caso in cui cambino? Devi digitare molto.
tooluser,

1

Versione Swift 3.0

let arr = yourString.components(separatedBy: "/")
let month = arr[0]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.