Простой способ установить один символ строки NSS в верхний регистр - PullRequest
10 голосов
/ 19 мая 2009

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

Я сейчас использую:

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

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

Ответы [ 5 ]

17 голосов
/ 19 мая 2009

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

 NSString *capitalisedSentence = 
    [dateString stringByReplacingCharactersInRange:NSMakeRange(0,1)  
    withString:[[dateString  substringToIndex:1] capitalizedString]];
3 голосов
/ 19 мая 2009

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

1 голос
/ 19 ноября 2013

Стремясь к максимальной читабельности, сделайте 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 для улучшения читаемости.

1 голос
/ 19 июня 2013

Если вы профилируете эти решения, они намного медленнее, чем делают это:

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 мс;

1 голос
/ 07 сентября 2011

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

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