Tách một NSString để truy cập một phần cụ thể


142

Tôi có một chuỗi như thế này: @"10/04/2011"và tôi muốn chỉ lưu "10" trong một chuỗi khác. Làm thế nào tôi có thể làm điều đó?


1
Giải pháp tốt nhất là sử dụng NSDate và NSDateFormatter. Tín dụng bổ sung và mã chất lượng tốt hơn nếu bạn thực sự bản địa hóa nó vào hệ thống để có thể xử lý chênh lệch tháng / ngày / tháng.
EricLeaf

@EricLeaf nơi trong câu hỏi có nói chuỗi là ngày không?
JeremyP

Câu trả lời:


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

Cập nhật ngày 7/3/2018:

Bây giờ câu hỏi đã có được thẻ Swift, tôi nên thêm cách Swift để làm điều này. Nó khá đơn giản:

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

Mặc dù lưu ý rằng nó cung cấp cho bạn một mảng Substring. Nếu bạn cần chuyển đổi các chuỗi này trở lại chuỗi thông thường, hãy sử dụngmap

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

hoặc là

let firstBit = String(substrings[0])

1
Sử dụng [foo firstObject]có thể tốt hơn trong trường hợp chung vì nó cũng sẽ xử lý đúng mảng trống.
Bobrovsky

2
@Bobrovsky trong trường hợp chung, sẽ tốt hơn nếu xác thực chuỗi để đảm bảo đó là một ngày. Đây chỉ là một ví dụ trả lời câu hỏi cụ thể. Cũng có thể khái quát hơn để có được bất kỳ phần nào trong ba phần ngày.
JeremyP

Mặc dù có rất nhiều người ủng hộ tôi phải không đồng ý. Đầu tiên, tại sao bạn nghĩ 10 là ngày thay vì tháng? Cách tiếp cận đầu sai này là lý do tại sao chúng tôi gặp vấn đề Y2K.
EricLeaf

2
@EricLeaf Câu hỏi cho biết "Tôi chỉ muốn lưu 10 trong một chuỗi". Tôi có thể gọi bất cứ thứ gì. Câu trả lời là chính xác cho câu hỏi. Trong thực tế, không nơi nào câu hỏi nói rằng đó là một ngày, vì vậy tôi đã sửa đổi câu trả lời.
JeremyP

36

Một trong hai điều này:

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

Mặc dù hãy nhớ rằng đôi khi một chuỗi ngày không được định dạng đúng và một ngày (hoặc một tháng cho vấn đề đó) được hiển thị là 8, thay vì 08, vì vậy, chuỗi đầu tiên có thể là tồi tệ nhất trong 2 giải pháp.

Cái sau nên được đặt vào một mảng riêng để bạn thực sự có thể kiểm tra độ dài của thứ được trả về, do đó bạn không nhận được bất kỳ ngoại lệ nào được ném trong trường hợp chuỗi ngày bị hỏng hoặc không hợp lệ từ bất kỳ nguồn nào bạn có.


Điều đó đúng, chỉ cần lưu ý rằng trong phương thức subStringWithRange, chữ "S" thứ hai không được là "chữ thường" (chuỗi conWithRange) hoặc bạn sẽ gặp lỗi như "phương thức này không tồn tại".
Marcos Reboucas

9

Nó hoạt động tốt

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

8

Mục tiêu-c:

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

Nhanh:

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


5

Tôi đã định dạng giải pháp tốt đẹp do JeremyP cung cấp ở trên thành một chức năng tái sử dụng chung chung hơn dưới đây:

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

5
Tại sao không chỉ sử dụng các thành phầnSeparatedByString trực tiếp?
John Gibb

1
bởi vì tôi đang sử dụng nó trên một số dự án, vì vậy nếu có bất cứ điều gì thay đổi, tôi chỉ phải thay đổi phần thân của hàm bao bọc thay vì ở một vài nơi. Nhưng nếu bạn chỉ sử dụng một lần, vì vậy, nó có ý nghĩa hơn khi sử dụng nó trực tiếp Chúc mừng!
Khayrattee Wasseem

3
các thành phầnSeparatedByString đã không thay đổi trong khoảng hai thập kỷ. Bạn có bao bọc tất cả các cuộc gọi phương thức của Apple trong trường hợp chúng thay đổi không? Bạn phải gõ rất nhiều.
cụ

1

Phiên bản Swift 3.0

let arr = yourString.components(separatedBy: "/")
let month = arr[0]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.