web-dev-qa-db-ja.com

Objective-Cで文の最初の単語を大文字にする方法は?

私はすでに文のすべての単語を大文字にする方法を見つけましたが、最初の単語だけではありません。

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

小文字に変更して最初の文字を大文字にしたくない。他の人を変えることなく、最初の言葉だけを大文字にしたいと思います。

33
wal

ここでもう一度やってみましょう:

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)
118
Johan Kool

受け入れられた答えは間違っています。まず、ユーザーが期待する意味で、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:を使用してNSStringEnumerationBySentences | NSStringEnumerationLocalizedの外部呼び出しで上記を囲みます。内部呼び出しでは、範囲呼び出しとして外部呼び出しによって提供されたsubstringRangeを渡します。

15
Ken Thomases

使用する

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

配列の最初のオブジェクトを大文字にし、次に使用します

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

それらに戻って参加する

8
Tuomas Pelkonen
pString = [pString
           stringByReplacingCharactersInRange:NSMakeRange(0,1)
           withString:[[pString substringToIndex:1] capitalizedString]];
3
Ela

正規表現を使ってユーザーができます。私が行った作業は簡単です。コードの下に貼り付けることができます+(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];

1
Ashok Kumar

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()
0
Antoine

質問が具体的には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
}
0
pheedsta

オプションを用意するために、以下をお勧めします。

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 *を返すため、使用できませんでした。

0
alesplin

Swiftの代替ソリューション:

var str = "hello"

if count(str) > 0 {
    str.splice(String(str.removeAtIndex(str.startIndex)).uppercaseString, atIndex: str.startIndex)
}
0
Johan Kool