如何将Objective-C中句子的第一个单词大写?

wal*_*wal 34 string cocoa objective-c capitalization nsstring

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

NSString *txt =@"hi my friends!"
[txt capitalizedString];
Run Code Online (Sandbox Code Playgroud)

我不想改成小写并将第一个字符大写.我想把第一个单词大写,而不改变其他单词.

Joh*_*ool 118

这是另一个进展:

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

对于Swift语言:

txt.replaceRange(txt.startIndex...txt.startIndex, with: String(txt[txt.startIndex]).capitalizedString)
Run Code Online (Sandbox Code Playgroud)

  • 只要确保字符串总是至少1个字符长,或者你已经准备好处理抛出的异常,但事实并非如此. (9认同)
  • @looneydoodle你的意思是`if([txt length]> 0)`.如果长度为1,它可以正常工作. (8认同)

Ken*_*ses 15

接受的答案是错误的.首先,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;
}];
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你想把每个单词都大写,那么根本不需要用单词进行枚举.这是`-capitalizedStringWithLocale:`的默认行为.即使你确实想要枚举每个单词,这样做的方法就是永远不要设置`*stop`.枚举将自然地在字符串的末尾结束.(一般来说,在Cocoa的enumeration-with-block方法中,你不应该设置`*stop`,除非你将它设置为true.这在并发枚举中最重要,但它适用于所有情况的设计合同.) (2认同)

Tuo*_*nen 8

使用

- (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator
Run Code Online (Sandbox Code Playgroud)

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

- (NSString *)componentsJoinedByString:(NSString *)separator
Run Code Online (Sandbox Code Playgroud)

加入他们

  • 是的,仅将第一个单词大写。不幸的是,Objective-C 不像 Python,每个操作都可以在一行中完成。 (2认同)