私はすでに文のすべての単語を大文字にする方法を見つけましたが、最初の単語だけではありません。
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:
を使用して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では、この拡張機能を使用することで、次のように実行できます。
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()
質問が具体的には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 *
を返すため、使用できませんでした。
Swiftの代替ソリューション:
var str = "hello"
if count(str) > 0 {
str.splice(String(str.removeAtIndex(str.startIndex)).uppercaseString, atIndex: str.startIndex)
}