Objective C строки, манипулирование, заглядывать, добавление к - PullRequest
0 голосов
/ 09 июля 2010

Я пытаюсь манипулировать предоставленной мне строкой открытых часов.

Она плохо отформатирована, и мне нужно привести ее в соответствие с тем же стандартом, что и другой фрагмент данных из другого источника.

Пн-Ср. 930-1700 Чт. 900-1700 Пт. 930-1700
Пн. - Ср. 930-1700 Чт.
Пн. - Ср. 930-1700 Чт. 900-1700 Пт. 930-1700 Сб. 900-1200

Как видите, между днями в дефисах не всегда есть пробелы и т. Д.он должен быть разделен точкой с запятой следующим образом:

пн-ср. 930-1700; чт 900-1700; пт 930-1700
пн - ср 930-1700; чт 900-1700; пт 930-1700
пн - чт 930-1600; пт 930-1700
пн - ср 930-1700; чт 900-1700; пт 930-1700; сб 900-1200

Не уверен, что это лучше/ простое решение, но у меня была идея проверить, есть ли пробел после нуля, и если после этого нуля есть буква, например, M, T, W, F или S. Тогда я бы знал, что это конец одного наборачасs и замените пробел точкой с запятой.Я новичок в цели c и действительно не знаю, как заглянуть вперед или проверить отдельные символы в строке NSString.Это также может показаться сложным решением.

Кроме того, мне нужно перевести эти часы из 24-часового в 12-часовое время.например, с 17:00 до 17:00, с 09:30 до 9:30.Я понимаю, что могу вычесть 1200 и добавить pm, но как мне добавить: между часом и минутой, а также удалить начальный ноль, если это до 10:00 am ?

Извините за большой объем текста, но ячувствовал, что лучше было бы объяснить это больше в начале.

Приветствия

Ответы [ 2 ]

1 голос
/ 09 июля 2010
// side note: you should probably not mess around with individual characters unless you're only dealing with ASCII

NSString *text = // all your text  

NSMutableString *mutableText = [[text mutableCopy] autorelease];  // make a mutable copy so we can change in place

[mutableText replaceOccurrencesOfString:@"\t" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [mutableText length])]; // delete Tabs
[mutableText replaceOccurrencesOfString:@" -" withString:@"-" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [mutableText length])]; // make all dashes consistent
[mutableText replaceOccurrencesOfString:@"- " withString:@"-" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [mutableText length])];

NSArray *words = [mutableText componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; // split each line

NSMutableString *cleanedText = [NSMutableString stringWithCapacity:0]; // will hold cleaned-up string

// go thru each line and insert semi-colon after all but the last hours 
for (NSString *record in words)
{ 
    // assumes all hours end in zero
    NSString *newRecord = [record stringByReplacingOccurrencesOfString:@"0 " withString:@"0;" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [record length])];
    [cleanedText appendFormat:@"%@\n", newRecord];
}

NSLog(@"%@", cleanedText); // all done

Не стесняйтесь задавать дополнительные вопросы, но если у вас есть другой конкретный вопрос по связанной теме, сделайте это новым вопросом здесь, в StackOverflow. Это делает его более доступным для поиска, что является главной целью этого сайта.

0 голосов
/ 10 июля 2010

Это то, что я придумал, но это все еще хитро. Не является ли их более простым способом поиска по строке, чтобы найти букву с нулевым пробелом (как в пн-чт 800-1700 пт), а затем вставить символ?

Я использовал RegexKitLite и придумал следующее.

NSString *regexString = @"(\\d\\d\\d\\s[A-Za-z])"; //look for 3 numbers a space and a letter

NSRange matchedRange = NSMakeRange(NSNotFound,NSNotFound);

//clean other common problems in data
NSString *outputString = [hoursString stringByReplacingOccurrencesOfString:@"," withString:@""]; 

outputString = [outputString stringByReplacingOccurrencesOfString:@"." withString:@""];

outputString = [outputString stringByReplacingOccurrencesOfString:@" &" withString:@""];

NSRange replaceRange;

while (!matchedRange.length == 0) { //loop while not all matches in the one string found and fixed

    matchedRange = [outputString rangeOfRegex:regexString capture: 1];

    if (!matchedRange.length == 0) {

       //we want to add a semicolon 3 characters after the first found number
        replaceRange = NSMakeRange(matchedRange.location+3, 1);
       //replace space with ;
        outputString = [outputString stringByReplacingCharactersInRange:replaceRange withString:@";"];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...