文のすべての単語を大文字にする方法をすでに見つけましたが、最初の単語だけではありません。
NSString *txt =@"hi my friends!"
[txt capitalizedString];
小文字に変更して最初の文字を大文字にしたくありません。他の単語を変更せずに、最初の単語だけを大文字にしたい。
文のすべての単語を大文字にする方法をすでに見つけましたが、最初の単語だけではありません。
NSString *txt =@"hi my friends!"
[txt capitalizedString];
小文字に変更して最初の文字を大文字にしたくありません。他の単語を変更せずに、最初の単語だけを大文字にしたい。
ここに別の試みがあります:
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)
受け入れられた答えは間違っています。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 | NSStringEnumerationLocalized
。substringRange
内側の呼び出しでは、外側の呼び出しによって提供された を範囲引数として渡します。
使用する
- (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator
配列の最初のオブジェクトを大文字にしてから、
- (NSString *)componentsJoinedByString:(NSString *)separator
それらに再び参加する
pString = [pString
stringByReplacingCharactersInRange:NSMakeRange(0,1)
withString:[[pString substringToIndex:1] capitalizedString]];
あなたは正規表現を使用することができます私はそれが私のために簡単に動作しますコードの下に貼り付けることができます +(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];
Swift の代替ソリューション:
var str = "hello"
if count(str) > 0 {
str.splice(String(str.removeAtIndex(str.startIndex)).uppercaseString, atIndex: str.startIndex)
}
質問が具体的に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
}
オプションを用意するために、次のことをお勧めします。
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 *
.