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まず、 の単位をユーザーが期待する意味で「文字」として扱うのは正しくありません。サロゲートペアがあります。結合シーケンスがあります。それらを分割すると、誤った結果が生成されます。第 2 に、最初の文字を大文字にしても、その文字を含む単語を大文字にしても同じ結果になるとは限りません。言語は状況依存である場合があります。

これを行う正しい方法は、ロケールに適した方法で単語 (および場合によっては文) を識別するフレームワークを取得することです。また、ロケールに適した方法で大文字にすることもできます。

[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 | NSStringEnumerationLocalizedsubstringRange内側の呼び出しでは、外側の呼び出しによって提供された を範囲引数として渡します。

于 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

質問が具体的に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 に答える
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 に答える