Belirli bir parçaya erişmek için bir NSString'i bölme


142

Ben böyle bir dize var: @"10/04/2011"ve sadece "10" başka bir dize kaydetmek istiyorum. Bunu nasıl yapabilirim?


1
En iyi çözüm NSDate ve NSDateFormatter kullanmak olacaktır. Ekstra kredi ve daha iyi kalite kodu aslında ay / gün gün / ay farkları ile başa çıkmak için sisteme yerelleştirmek eğer.
EricLeaf

@EricLeaf soruda dizenin bir tarih olduğunu söylüyor?
JeremyP

Yanıtlar:


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

7/3/2018 Güncellemesi:

Şimdi soru bir Swift etiketi edindiğine göre, bunu Swift'in yolunu eklemeliyim. Oldukça basit:

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

Rağmen size bir dizi verir unutmayın Substring. Bunları normal dizelere dönüştürmeniz gerekiyorsa,map

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

veya

let firstBit = String(substrings[0])

1
[foo firstObject]Boş diziyi de düzgün işleyeceği için kullanmak genel olarak daha iyi olabilir.
Bobrovsky

2
@Bobrovsky genel durumda, bir tarih olduğundan emin olmak için dizeyi doğrulamak daha iyi olur. Bu sadece belirli soruyu cevaplayan bir örnektir. Üç tarih bölümünden herhangi birini almak daha genelleştirilebilir.
JeremyP

Upvotes kitlelerine rağmen katılmıyorum. İlk olarak, neden 10'un ay yerine gün olduğunu düşünüyorsunuz? Bu tür yanlış yönelimli yaklaşım Y2K sorunumuzun neden böyle olduğudur.
EricLeaf

2
@EricLeaf Soru "Ben sadece 10 bir dize kaydetmek istiyorum" diyor. Değişkene bir şey diyebilirdim. Cevap soru için doğrudur. Aslında, soru hiçbir yerde bunun bir tarih olduğunu söylemiyor, bu yüzden cevabı değiştirdim.
JeremyP

36

Bunlardan herhangi biri 2:

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

Bununla birlikte, bazen bir tarih dizesinin düzgün biçimlendirilmediğini ve bir günün (veya bu konu için bir ayın) 08 yerine 8 olarak gösterildiğini unutmayın, bu nedenle birincisi 2 çözümden en kötüsü olabilir.

İkincisi ayrı bir diziye konulmalıdır, böylece döndürülen şeyin uzunluğunu kontrol edebilirsiniz, böylece sahip olduğunuz herhangi bir kaynaktan bozuk veya geçersiz bir tarih dizesi durumunda atılan herhangi bir istisna alamazsınız.


Bu doğru, sadece subStringWithRange yönteminde ikinci "S" "küçük harf" (substringWithRange) olmamalıdır ya da "bu yöntem yok" gibi bir hata alırsınız unutmayın.
Marcos Reboucas

9

İyi çalışıyor

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

8

Amaç-c:

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

Swift:

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


5

Yukarıda JeremyP tarafından sağlanan güzel çözümü aşağıdaki daha genel bir yeniden kullanılabilir fonksiyona biçimlendirdim :

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

5
Neden sadece doğrudan ComponentsSeparatedByString kullanmıyorsunuz?
John Gibb

1
çünkü birkaç projede kullanıyorum, eğer bir şey değişirse, sargı fonksiyonunun gövdesini birkaç yerde değiştirmek zorundayım. Ama sadece bir kez kullanıyorsanız, bu yüzden evet doğrudan kullanmak daha mantıklı Cheers!
Khayrattee Wasseem

3
componentsSeparatedByString, yirmi yıl gibi bir şeyle değişmedi. Değişmeleri durumunda tüm Apple yöntemi çağrılarını kaydırıyor musunuz? Çok yazmalısınız.
takım kullanıcısı

1

Swift 3.0 sürümü

let arr = yourString.components(separatedBy: "/")
let month = arr[0]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.