Teilen Sie einen NSString, um auf ein bestimmtes Teil zuzugreifen


142

Ich habe eine Zeichenfolge wie diese: @"10/04/2011"und ich möchte nur die "10" in einer anderen Zeichenfolge speichern. Wie kann ich das machen?


1
Die beste Lösung wäre die Verwendung von NSDate und NSDateFormatter. Zusätzliches Guthaben und Code mit besserer Qualität, wenn Sie ihn tatsächlich im System lokalisieren, um möglicherweise die Unterschiede zwischen Monat, Tag, Tag und Monat zu beheben.
EricLeaf

@EricLeaf wo in der Frage steht, dass die Zeichenfolge ein Datum ist?
JeremyP

Antworten:


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

Update 03.07.2008:

Nachdem die Frage ein Swift-Tag erhalten hat, sollte ich die Swift-Methode hinzufügen. Es ist ziemlich einfach:

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

Beachten Sie jedoch, dass es Ihnen eine Reihe von gibt Substring. Wenn Sie diese wieder in normale Zeichenfolgen konvertieren müssen, verwenden Siemap

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

oder

let firstBit = String(substrings[0])

1
Die Verwendung [foo firstObject]ist im Allgemeinen möglicherweise besser, da auch leere Arrays ordnungsgemäß verarbeitet werden.
Bobrovsky

2
@Bobrovsky Im allgemeinen Fall ist es besser, die Zeichenfolge zu überprüfen, um sicherzustellen, dass es sich um ein Datum handelt. Dies ist nur ein Beispiel, das die spezifische Frage beantwortet. Es ist auch allgemeiner, einen der drei Datumsteile zu erhalten.
JeremyP

Trotz der vielen Stimmen muss ich nicht zustimmen. Erstens, warum denkst du, ist die 10 Tag statt Monat? Diese Art von falschem Ansatz ist der Grund, warum wir das Jahr 2000-Problem hatten.
EricLeaf

2
@EricLeaf Die Frage lautet "Ich möchte nur die 10 in einer Zeichenfolge speichern". Ich hätte die Variable alles nennen können. Die Antwort ist richtig für die Frage. In der Tat sagt die Frage nirgends, dass es sich um ein Datum handelt, daher habe ich die Antwort geändert.
JeremyP

36

Eine dieser 2:

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

Beachten Sie jedoch, dass manchmal eine Datumszeichenfolge nicht richtig formatiert ist und ein Tag (oder ein Monat) als 8 anstatt als 08 angezeigt wird, sodass die erste möglicherweise die schlechteste der beiden Lösungen ist.

Letzteres sollte in einem separaten Array abgelegt werden, damit Sie tatsächlich die Länge des zurückgegebenen Objekts überprüfen können, damit im Falle einer beschädigten oder ungültigen Datumszeichenfolge aus einer beliebigen Quelle keine Ausnahmen ausgelöst werden.


Beachten Sie nur, dass in der subStringWithRange-Methode das zweite "S" nicht "Kleinbuchstaben" (substringWithRange) sein sollte, da sonst die Fehlermeldung "Diese Methode existiert nicht" angezeigt wird.
Marcos Reboucas

9

Es funktioniert gut

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

8

Ziel c:

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

Schnell:

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


5

Ich habe die nette Lösung von JeremyP oben in eine allgemeinere wiederverwendbare Funktion unten formatiert :

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

5
Warum nicht einfach componentsSeparatedByString direkt verwenden?
John Gibb

1
Da ich es für mehrere Projekte verwende, muss ich, wenn sich etwas ändert, nur den Hauptteil der Wrapper-Funktion ändern, anstatt an mehreren Stellen. Aber wenn Sie es nur einmal verwenden, ist es sinnvoller, es direkt zu verwenden. Prost!
Khayrattee Wasseem

3
componentsSeparatedByString hat sich in etwa zwei Jahrzehnten nicht verändert. Schließen Sie alle Apple-Methodenaufrufe ein, falls sie sich ändern? Sie müssen viel eingeben.
Tooluser

1

Swift 3.0 Version

let arr = yourString.components(separatedBy: "/")
let month = arr[0]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.