10

我想将 NSString 的第一个字符更改为大写。不幸的是,- (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];

这似乎有点令人费解,但至少对底层 unicode 字符串的编码没有任何假设。

4

5 回答 5

17

与您所拥有的方法非常相似,但更简洁:

 NSString *capitalisedSentence = 
    [dateString stringByReplacingCharactersInRange:NSMakeRange(0,1)  
    withString:[[dateString  substringToIndex:1] capitalizedString]];
于 2009-05-19T19:59:20.137 回答
3

由于NSString是不可变的,你所拥有的似乎是做你想做的事的好方法。和类似方法的实现(NSString*)uppercaseString可能看起来非常像您编写的内容,因为它们返回一个新NSString的而不是修改您发送消息的那个。

于 2009-05-19T19:53:51.443 回答
1

我有类似的要求,但它是针对字符串中的字符的。这假设 i 是您想要大写的字符的索引,这对我有用:

curword = [curword stringByReplacingCharactersInRange:NSMakeRange(i,1) 
           withString:[[curword substringWithRange:NSMakeRange(i, 1)] capitalizedString]];
于 2011-09-07T15:57:58.150 回答
1

如果您分析这些解决方案,它们会慢得多,然后这样做:

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

在运行 iOS 5 的 iphone 4 上进行测试:
@doomspork 的解决方案在 0.115750 毫秒内
运行,而上述解决方案在 0.064250 毫秒内运行;

在运行 iOS 5 的模拟器上进行测试:
@doomspork 的解决方案在 0.021232 毫秒内
运行,而上述解决方案在 0.007495 毫秒内运行;

于 2013-06-18T20:25:30.107 回答
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);

这种代码很少出现在您需要它的地方,通常应该将其分解为实用程序类或 acategory以提高易读性。

于 2013-11-18T22:23:00.947 回答