Разделить 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.