แบ่ง NSString เพื่อเข้าถึงชิ้นส่วนเฉพาะ


142

ฉันมีสตริงเช่นนี้@"10/04/2011"และฉันต้องการบันทึกเพียง "10" ในสายอื่น ฉันจะทำสิ่งนั้นได้อย่างไร


1
ทางออกที่ดีที่สุดคือการใช้ NSDate และ NSDateFormatter เครดิตพิเศษและรหัสคุณภาพที่ดีขึ้นหากคุณแปลเป็นภาษาท้องถิ่นกับระบบเพื่อจัดการกับความแตกต่างของเดือน / วัน / เดือน
EricLeaf

@EricLeaf มีคำถามอะไรที่บอกว่าสตริงเป็นวันที่หรือไม่
JeremyP

คำตอบ:


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

อัปเดต 7/3/2561:

ตอนนี้คำถามที่ได้รับแท็ก Swift ฉันควรเพิ่มวิธีการทำอย่างนี้ Swift มันง่ายมาก:

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

Substringแม้ว่าจะทราบว่ามันจะช่วยให้คุณอาเรย์ของ หากคุณต้องการแปลงกลับเป็นสตริงทั่วไปให้ใช้map

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

หรือ

let firstBit = String(substrings[0])

1
การใช้[foo firstObject]อาจจะดีกว่าในกรณีทั่วไปเพราะมันจะจัดการอาเรย์ที่ว่างเปล่าได้อย่างเหมาะสมเช่นกัน
Bobrovsky

2
@ Bobrovsky ในกรณีทั่วไปมันจะดีกว่าที่จะตรวจสอบสตริงเพื่อให้แน่ใจว่ามันเป็นวันที่ นี่เป็นเพียงตัวอย่างที่ตอบคำถามเฉพาะ นอกจากนี้ยังเป็นเรื่องทั่วไปที่จะได้รับส่วนใดส่วนหนึ่งในสามของวันที่
JeremyP

แม้จะมีฝูง upvotes ฉันต้องไม่เห็นด้วย ก่อนอื่นทำไมคุณคิดว่า 10 คือวันแทนที่จะเป็นเดือน วิธีการหัวที่ผิดประเภทนี้คือสาเหตุที่เรามีปัญหา Y2K
EricLeaf

2
@EricLeaf คำถามพูดว่า "ฉันแค่ต้องการบันทึก 10 ในสตริง" ฉันสามารถเรียกตัวแปรอะไรก็ได้ คำตอบนั้นถูกต้องสำหรับคำถาม ในความเป็นจริงไม่มีคำถามที่บอกว่ามันเป็นวันที่ดังนั้นฉันได้แก้ไขคำตอบ
JeremyP

36

ทั้งสองอย่างนี้:

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

แม้ว่าโปรดจำไว้ว่าบางครั้งสตริงวันที่ไม่ได้จัดรูปแบบอย่างถูกต้องและวัน (หรือเดือนสำหรับเรื่องนั้น) แสดงเป็น 8 แทนที่จะเป็น 08 ดังนั้นคนแรกอาจเป็นโซลูชันที่แย่ที่สุดของทั้งสอง

หลังควรใส่ไว้ในอาร์เรย์ที่แยกต่างหากเพื่อให้คุณสามารถตรวจสอบความยาวของสิ่งที่ส่งคืนได้ดังนั้นคุณจะไม่ได้รับข้อยกเว้นใด ๆ ในกรณีของสตริงวันที่ที่เสียหายหรือไม่ถูกต้องจากแหล่งใด ๆ ที่คุณมี


ถูกต้องเพียงแค่ทราบว่าในวิธีการ subStringWithRange "S" ตัวที่สองไม่ควรเป็น "ตัวพิมพ์เล็ก" (substringWithRange) หรือคุณจะได้รับข้อผิดพลาดเช่น "วิธีนี้ไม่มีอยู่"
Marcos Reboucas

9

มันทำงานได้ดี

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];

สวิฟท์:

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


5

ฉันได้จัดรูปแบบวิธีแก้ปัญหาที่ดีโดย JeremyP ข้างต้นเป็นฟังก์ชั่นที่ใช้ซ้ำได้ทั่วไปด้านล่าง:

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

5
ทำไมไม่ใช้ส่วนประกอบแยกโดยสายโดยตรง?
John Gibb

1
เพราะฉันใช้มันในหลายโครงการดังนั้นหากมีอะไรเปลี่ยนแปลงฉันแค่ต้องเปลี่ยนส่วนของฟังก์ชั่น wrapper แทนที่จะเป็นหลาย ๆ ที่ แต่ถ้าคุณใช้เพียงครั้งเดียวดังนั้นใช่มันเหมาะสมกว่าที่จะใช้มันโดยตรง ไชโย!
Khayrattee Wasseem

3
componentsSeparatedByString ไม่ได้เปลี่ยนไปเหมือนสองทศวรรษ คุณรวมการโทรด้วยวิธี Apple ทั้งหมดในกรณีที่มีการเปลี่ยนแปลงหรือไม่ คุณต้องพิมพ์มาก
tooluser

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.