Разделить 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/3/2018:

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

2
@Bobrovsky в общем случае, было бы лучше проверить строку, чтобы убедиться, что это дата. Это всего лишь пример, который отвечает на конкретный вопрос. Также более обобщенно получить любую из трех частей даты.
— JeremyP

Несмотря на массу голосов, я должен не согласиться. Во-первых, почему вы думаете, что 10 день, а не месяц? Такой неправильный подход - вот почему у нас была проблема 2000 года.
— 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

Objective-C:

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

Swift:

     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
потому что я использую его в нескольких проектах, поэтому, если что-то изменится, мне нужно просто изменить тело функции-обертки, а не в нескольких местах. Но если вы просто использовать его один раз, так что да , это имеет смысл использовать его непосредственно Ура!
— Хайратти Вассим

3
componentSeparatedByString не изменился примерно за два десятилетия. Оборачиваете ли вы все вызовы методов Apple на случай их изменения? Вы должны много печатать.
— Tooluser

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.