Podziel NSString, aby uzyskać dostęp do jednego określonego elementu


142

Mam taki ciąg: @"10/04/2011"i chcę zapisać tylko „10” w innym ciągu. Jak mogę to zrobić?


1
Najlepszym rozwiązaniem byłoby użycie NSDate i NSDateFormatter. Dodatkowy kredyt i kod lepszej jakości, jeśli faktycznie zlokalizujesz go w systemie, aby być może poradzić sobie z różnicami miesiąc / dzień, dzień / miesiąc.
EricLeaf

@EricLeaf Gdzie w pytaniu jest napisane, że ciąg jest datą?
JeremyP

Odpowiedzi:


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

Aktualizacja 7/3/2018:

Teraz, gdy pytanie uzyskało znacznik Swift, powinienem dodać szybki sposób zrobienia tego. To jest prawie tak proste:

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

Chociaż zauważ, że daje ci tablicę Substring. Jeśli chcesz przekonwertować je z powrotem na zwykłe ciągi, użyjmap

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

lub

let firstBit = String(substrings[0])

1
Użycie [foo firstObject]może być lepsze w ogólnym przypadku, ponieważ będzie również poprawnie obsługiwać pustą tablicę.
Bobrovsky,

2
@Bobrovsky w ogólnym przypadku byłoby lepiej sprawdzić poprawność ciągu, aby upewnić się, że jest to data. To tylko przykład, który odpowiada na konkretne pytanie. Bardziej uogólnione jest również pobranie dowolnej z trzech części daty.
JeremyP

Pomimo wielu głosów poparcia, nie zgadzam się. Po pierwsze, dlaczego myślisz, że 10 to dzień zamiast miesiąca? Tego rodzaju błędne podejście jest przyczyną problemu z rokiem 2000.
EricLeaf,

2
@EricLeaf Pytanie brzmi: „Chcę tylko zapisać 10 w ciągu”. Mogłem nazwać zmienną cokolwiek. Odpowiedź jest poprawna na pytanie. W rzeczywistości pytanie nigdzie nie mówi, że jest to data, więc poprawiłem odpowiedź.
JeremyP

36

Którykolwiek z tych 2:

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

Pamiętaj jednak, że czasami ciąg daty nie jest poprawnie sformatowany, a dzień (lub miesiąc) jest wyświetlany jako 8, a nie 08, więc pierwsze z nich może być najgorszym z dwóch rozwiązań.

Ta ostatnia powinna zostać umieszczona w oddzielnej tablicy, aby można było faktycznie sprawdzić długość zwracanej rzeczy, dzięki czemu nie otrzymasz żadnych wyjątków w przypadku nieprawidłowego lub nieprawidłowego ciągu daty z dowolnego źródła.


to jest poprawne, po prostu zauważ, że w metodzie subStringWithRange drugie „S” nie powinno być „małymi literami” (substringWithRange), w przeciwnym razie pojawi się błąd „ta metoda nie istnieje”.
Marcos Reboucas

9

Działa dobrze

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

8

Cel C:

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

Szybki:

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


5

Sformatowałem fajne rozwiązanie dostarczone przez JeremyP powyżej w bardziej ogólną funkcję wielokrotnego użytku poniżej:

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

5
Dlaczego po prostu nie użyć bezpośrednio componentsSeparatedByString?
John Gibb

1
ponieważ używam go w kilku projektach, więc jeśli coś się zmieni, muszę po prostu zmienić treść funkcji opakowania zamiast w kilku miejscach. Ale jeśli jesteś po prostu używając go raz, więc tak to większy sens go używać bezpośrednio Cheers!
Khayrattee Wasseem

3
componentsSeparatedByString nie zmieniło się od mniej więcej dwóch dekad. Czy zawijasz wszystkie wywołania metod Apple na wypadek, gdyby się zmieniły? Musisz dużo pisać.
tooluser

1

Wersja Swift 3.0

let arr = yourString.components(separatedBy: "/")
let month = arr[0]
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.