34

我已经找到了如何将句子的所有单词大写,但不仅仅是第一个单词。

NSString *txt =@"hi my friends!"
[txt capitalizedString];

我不想更改为小写并将第一个字符大写。我只想将第一个单词大写而不改变其他单词。

4

9 回答 9

118

这是另一个尝试:

NSString *txt = @"hi my friends!";
txt = [txt stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[txt substringToIndex:1] uppercaseString]];

对于 Swift 语言:

txt.replaceRange(txt.startIndex...txt.startIndex, with: String(txt[txt.startIndex]).capitalizedString)
于 2010-03-12T20:03:50.537 回答
16

接受的答案是错误的。NSString首先,在用户期望的意义上将 的单位视为“字符”是不正确的。有代理对。有组合序列。拆分这些会产生不正确的结果。其次,大写第一个字符不一定会产生与大写包含该字符的单词相同的结果。语言可以是上下文相关的。

正确的方法是让框架以适合语言环境的方式识别单词(可能还有句子)。并且还以适合语言环境的方式进行资本化。

[aMutableString enumerateSubstringsInRange:NSMakeRange(0, [aMutableString length])
                                   options:NSStringEnumerationByWords | NSStringEnumerationLocalized
                                usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
    [aMutableString replaceCharactersInRange:substringRange
                                  withString:[substring capitalizedStringWithLocale:[NSLocale currentLocale]]];
    *stop = YES;
}];

字符串的第一个单词可能与字符串的第一个句子的第一个单词不同。-enumerateSubstringsInRange:options:usingBlock:要识别字符串的第一个(或每个)句子,然后将那个(或那些)的第一个单词大写,然后在using的外部调用中将上述内容包围起来NSStringEnumerationBySentences | NSStringEnumerationLocalized。在内部调用中,将substringRange外部调用提供的作为范围参数传递。

于 2014-07-12T10:40:29.213 回答
10

采用

- (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator

并将数组中的第一个对象大写,然后使用

- (NSString *)componentsJoinedByString:(NSString *)separator

加入他们

于 2010-03-12T11:58:04.093 回答
4
pString = [pString
           stringByReplacingCharactersInRange:NSMakeRange(0,1)
           withString:[[pString substringToIndex:1] capitalizedString]];
于 2014-07-04T07:33:58.960 回答
1

你可以使用正则表达式我已经完成了它对我来说很简单你可以粘贴下面的代码 +(NSString*)CaptializeFirstCharacterOfSentence:(NSString*)sentence{

NSMutableString *firstCharacter = [sentence mutableCopy];
NSString *pattern = @"(^|\\.|\\?|\\!)\\s*(\\p{Letter})";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:NULL];
[regex enumerateMatchesInString:sentence options:0 range:NSMakeRange(0, [sentence length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
    //NSLog(@"%@", result);
    NSRange r = [result rangeAtIndex:2];
    [firstCharacter replaceCharactersInRange:r withString:[[sentence substringWithRange:r] uppercaseString]];
}];
NSLog(@"%@", firstCharacter);
return firstCharacter;

} //调用这个方法 NsString *resultSentence = [UserClass CaptializeFirstCharacterOfSentence:yourTexthere];

于 2015-02-26T09:49:45.293 回答
1

Swift 中的另一种解决方案:

var str = "hello"

if count(str) > 0 {
    str.splice(String(str.removeAtIndex(str.startIndex)).uppercaseString, atIndex: str.startIndex)
}
于 2015-05-12T09:45:13.813 回答
0

为了有选择,我建议:

NSString *myString = [NSString stringWithFormat:@"this is a string..."];

char *tmpStr = calloc([myString length] + 1,sizeof(char));

[myString getCString:tmpStr maxLength:[myString length] + 1 encoding:NSUTF8StringEncoding];

int sIndex = 0;

/* skip non-alpha characters at beginning of string */
while (!isalpha(tmpStr[sIndex])) {
    sIndex++;
}

toupper(tmpStr[sIndex]);

myString = [NSString stringWithCString:tmpStr encoding:NSUTF8StringEncoding];

我在工作,没有我的 Mac 来测试它,但如果我没记错的话,你不能使用[myString cStringUsingEncoding:NSUTF8StringEncoding],因为它返回一个const char *.

于 2010-03-12T19:47:24.970 回答
0

在swift中,您可以使用以下扩展名进行操作:

extension String {
    func ucfirst() -> String {
        return (self as NSString).stringByReplacingCharactersInRange(NSMakeRange(0, 1), withString: (self as NSString).substringToIndex(1).uppercaseString)
    }    
}

像这样调用你的字符串:

var ucfirstString:String = "test".ucfirst()
于 2014-12-17T16:03:57.163 回答
0

我知道这个问题专门针对 Objective C 的答案,但是这里是 Swift 2.0 的解决方案:

let txt = "hi my friends!"
var sentencecaseString = ""

for (index, character) in txt.characters.enumerate() {
    if 0 == index {
        sentencecaseString += String(character).uppercaseString
    } else {
        sentencecaseString.append(character)
    }
}

或作为扩展:

func sentencecaseString() -> String {
    var sentencecaseString = ""
    for (index, character) in self.characters.enumerate() {
        if 0 == index {
            sentencecaseString += String(character).uppercaseString
        } else {
            sentencecaseString.append(character)
        }
    }
    return sentencecaseString
}
于 2015-08-11T00:45:57.720 回答