2009-05-19 4 views
10

Я хотел бы изменить первый символ NSString на верхний регистр. К сожалению, - (NSString *)capitalizedString преобразует первую букву каждого слова в верхний регистр. Есть ли простой способ конвертировать только один символ в верхний регистр?Простой способ установить один символ NSString в верхний регистр

настоящее время я использую:

NSRange firstCharRange = NSMakeRange(0,1); 
NSString* firstCharacter = [dateString substringWithRange:firstCharRange]; 
NSString* uppercaseFirstChar = [firstCharacter originalString]; 
NSMutableString* capitalisedSentence = [originalString mutableCopy]; 
[capitalisedSentence replaceCharactersInRange:firstCharRange withString:uppercaseFirstChar]; 

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

+0

Существует хорошее обсуждение картографирования случаев здесь: http://userguide.icu-project.org/transforms/casemappings В терминологии этой страницы вы хотите сделать простое сопоставление символов? – sbooth

+0

@sbooth - это. –

ответ

3

С NSString неизменен, то, что у вас есть, является хорошим способом сделать то, что вы хотите сделать. Реализации (NSString*)uppercaseString и подобные методы, вероятно, очень похожи на то, что вы написали, поскольку они возвращают новый NSString вместо того, чтобы изменять тот, на который вы отправили сообщение.

+0

кажется, что символ подчеркивания считается допустимым разделителем, поэтому foo_bar будет преобразован в «Foo_Bar» – dwery

17

Очень похожий подход к тому, что у вас есть, но немного уплотняют:

NSString *capitalisedSentence = 
    [dateString stringByReplacingCharactersInRange:NSMakeRange(0,1) 
    withString:[[dateString substringToIndex:1] capitalizedString]]; 
+2

да, оптимизирован для cr/lf ;-) Мне нравится, когда оптимизатор выводит мои временные данные. –

1

У меня было подобное требование, но это было для символов в строке. Это при условии, я ваш индекс персонажа вы хотите прописным это работало для меня:

curword = [curword stringByReplacingCharactersInRange:NSMakeRange(i,1) 
      withString:[[curword substringWithRange:NSMakeRange(i, 1)] capitalizedString]]; 
1

Если профиль этих решений они гораздо медленнее, чем это сделать:

NSMutableString *capitolziedString = [NSMutableString stringWithString:originalString]; 
NSString *firstChar = [[capitolziedString substringWithRange:NSMakeRange(0,1)] uppercaseString]; 
[capitolziedString replaceCharactersInRange:NSMakeRange(0, 1) withString:firstChar]; 

в тестировании на качестве Iphone 4 работает iOS 5:
@ решение doomspork работает в 0.115750 мс
пока выше пробег в 0.064250 мс;

в тестировании на имитатора под управлением IOS 5:
@ решение doomspork врезался в 0.021232 мс
в то время как выше побежал в 0.007495 мс;

+0

Если эта функция повторяется многократно, может вызывать беспокойство, что ваше решение работает от 1/3 до 1/2 времени, но, как есть, мы ищем «самое простое» решение, которое можно было бы читать как наиболее разборчивый. – ArtOfWarfare

+0

@ArtOfWarfare Мое решение не так сложнее читать, то есть ваше, и если вы собираетесь инкапсулировать решение внутри категории, что вы, вероятно, никогда не будете смотреть снова, тогда вы должны построить самое быстрое решение, чтобы у вас не было некоторые странные проблемы с производительностью позже, потому что вы написали неэффективный код. – odyth

1

Стремясь к максимальной читаемости, сделать category на NSString и дать ему эту функцию:

NSString *capitalizeFirstLetter(NSString *string) { 
    NSString *firstCapital = [string substringToIndex:1].capitalizedString; 
    return [string stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:firstCapital]; 
} 

Затем в коде, где вы хотите:

NSString *capitalizedSentence = capitalizeFirstLetter(dateString); 

Такой код редко принадлежит место, где вам это нужно, и, как правило, следует учесть его в класс полезности или category, чтобы улучшить удобочитаемость.

Смежные вопросы