Розділіть NSString, щоб отримати доступ до одного конкретного фрагмента


142

У мене є такий рядок: @"10/04/2011"і я хочу зберегти лише "10" в іншій рядку. Як я можу це зробити?


1
Найкращим рішенням буде використання NSDate та NSDateFormatter. Код додаткового кредиту та кращої якості, якщо ви фактично локалізуєте його в системі, щоб, можливо, вирішувати різниці між місяцем / днем ​​день / місяць.
EricLeaf

@EricLeaf, де у запитанні написано, що рядок є датою?
JeremyP

Відповіді:


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

Оновлення 3.07.2018:

Тепер, коли питання придбало тег 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]може бути кращим у загальному випадку, оскільки воно також буде правильно обробляти порожній масив.
Бобровський

2
@Bobrovsky в загальному випадку, було б краще перевірити рядок, щоб переконатися, що це дата. Це лише приклад, який дає відповідь на конкретне запитання. Також більш загальним є отримання будь-якої з трьох частин дати.
JeremyP

Незважаючи на масу грошей, я маю згоду. По-перше, чому ви вважаєте, що 10 - це день замість місяця? Такий неправильний підхід, тому у нас виникла проблема Y2K.
EricLeaf

2
@EricLeaf Питання говорить "Я хочу лише зберегти 10 у рядку". Я міг би називати змінну чим завгодно. Відповідь правильна на запитання. Насправді, ніде запитання не говорить про те, що це дата, тому я змінив відповідь.
JeremyP

36

Будь-який із цих 2:

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

Хоча майте на увазі, що іноді рядок дати не форматований належним чином, а день (або місяць із цього питання) відображається як 8, а не як 08, тому перший може бути найгіршим із двох рішень.

Останній слід помістити в окремий масив, щоб ви могли фактично перевірити довжину повернутої речі, тому ви не отримаєте жодних винятків, викинутих у разі пошкодженого чи недійсного рядка дати з будь-якого джерела.


це правильно, просто зауважте, що в методі subStringWithRange другий "S" не повинен бути "малим регістром" (substringWithRange), або ви отримаєте помилку типу "цього методу не існує".
Маркос Ребукас

9

Його добре працює

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

8

Завдання-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
Чому б просто не використовувати компонентиSeparatedByString безпосередньо?
Джон Гібб

1
тому що я використовую його в декількох проектах, тому, якщо щось зміниться, мені просто потрібно змінити тіло функції обгортки, а не в декількох місцях. Але якщо ви просто використовуєте його один раз, так, так, це має сенс використовувати його безпосередньо Ура!
Khayrattee Wasseem

3
componentsSeparatedByString не змінився за щось, як два десятиліття. Чи завершуєте виклики всіх методів Apple, якщо вони змінюються? Ви повинні багато набрати.
інструмент користувач

1

Версія Swift 3.0

let arr = yourString.components(separatedBy: "/")
let month = arr[0]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.