NSStringの最初の文字を大文字にし、アクセントを削除するにはどうすればよいですか?
例えば、 Àlter
、Alter
、alter
はbecomeAlter
である必要があります。
だが、 /lter
、)lter
、:lter
は、最初の文字が文字ではないため、同じのままにしてください。
分音記号を削除したいので、 this method を次のような一般的な文字列操作メソッドと組み合わせて使用できます。
/* create a locale where diacritic marks are not considered important, e.g. US English */
NSLocale *locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en-US"] autorelease];
NSString *input = @"Àlter";
/* get first char */
NSString *firstChar = [input substringToIndex:1];
/* remove any diacritic mark */
NSString *folded = [firstChar stringByFoldingWithOptions:NSDiacriticInsensitiveSearch locale:locale];
/* create the new string */
NSString *result = [[folded uppercaseString] stringByAppendingString:[input substringFromIndex:1]];
この方法は使用しないでください。 1つの文字が異なる言語で異なる数を持っている可能性があるためです。そのためのdreamlaxの回答を確認できます。しかし、あなたは私の答えから何かを学ぶことになると確信しています。ハッピーコーディング:)
NSString *capitalisedSentence = nil;
//Does the string live in memory and does it have at least one letter?
if (yourString && yourString.length > 0) {
// Yes, it does.
capitalisedSentence = [yourString stringByReplacingCharactersInRange:NSMakeRange(0,1)
withString:[[yourString substringToIndex:1] capitalizedString]];
} else {
// No, it doesn't.
}
文字数を気にする必要があるのはなぜですか?
@""
などの空の文字列の最初の文字にアクセスしようとすると(たとえば、NSMakeRange
、substringToIndex
など)、アプリがクラッシュします。これを回避するには、処理する前に存在することを確認する必要があります。
nil
は、送信したメソッド呼び出しを監視します。
試してみたものはすべて消化します。nil
はあなたの友達です。
NSString
を使用できます:
- (NSString *)capitalizedString
または(iOS 6.0以降):
- (NSString *)capitalizedStringWithLocale:(NSLocale *)locale
これを実現するために使用できると思うステップのリストをドロップします。問題なくフォローできることを願っています! :)
decomposedStringWithCanonicalMapping
を使用して、アクセントを分解します(アクセント付き文字が不必要に削除されないようにするために重要です)upperCaseString
を使用して大文字に変換し、stringByReplacingCharactersInRange
を使用して最初の文字を元の文字列に戻します。[theString stringByReplacingOccurrencesOfString:@"
"withString:@" "]`残りのアクセントを削除するための一種の呼び出し。これはすべて、最初の文字を大文字にし、アクセントを削除する必要があります:)
IOS 9.0以降、現在のロケールを使用して文字列を大文字にする方法があります。
@property(readonly, copy) NSString *localizedCapitalizedString;
同様の状況でこの方法を使用していますが、質問が他の文字を小文字にするように要求したかどうかはわかりません。
- (NSString *)capitalizedOnlyFirstLetter {
if (self.length < 1) {
return @"";
}
else if (self.length == 1) {
return [self capitalizedString];
}
else {
NSString *firstChar = [self substringToIndex:1];
NSString *otherChars = [self substringWithRange:NSMakeRange(1, self.length - 1)];
return [NSString stringWithFormat:@"%@%@", [firstChar uppercaseString], [otherChars lowercaseString]];
}
}
いくつかのオプションを追加するために、このカテゴリを使用してNSString
の最初の文字を大文字にします。
@interface NSString (CapitalizeFirst)
- (NSString *)capitalizeFirst;
- (NSString *)removeDiacritic;
@end
@implementation NSString (CapitalizeFirst)
- (NSString *)capitalizeFirst {
if ( self.length <= 1 ) {
return [self uppercaseString];
}
else {
return [[[[self substringToIndex:1] removeDiacritic] uppercaseString] stringByAppendingString:[[self substringFromIndex:1] removeDiacritic]];
// Or: return [NSString stringWithFormat:@"%@%@", [[[self substringToIndex:1] removeDiacritic] uppercaseString], [[self substringFromIndex:1] removeDiacritic]];
}
}
- (NSString *)removeDiacritic { // Taken from: http://stackoverflow.com/a/10932536/1986221
NSData *data = [NSData dataUsingEncoding:NSASCIIStringEncoding
allowsLossyConversion:YES];
return [[NSString alloc] initWithData:data
encoding:NSASCIIStringEncoding];
}
@end
そして、あなたは単に呼び出すことができます:
NSString *helloWorld = @"hello world";
NSString *capitalized = [helloWorld capitalizeFirst];
NSLog(@"%@ - %@", helloWorld, capitalized);