web-dev-qa-db-ja.com

NSStringの最初の大文字

NSStringの最初の文字を大文字にし、アクセントを削除するにはどうすればよいですか?

例えば、 ÀlterAlteralterbecomeAlterである必要があります。

だが、 /lter)lter:lterは、最初の文字が文字ではないため、同じのままにしてください。

38

分音記号を削除したいので、 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]];
53
dreamlax

この方法は使用しないでください。 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.
}

文字数を気にする必要があるのはなぜですか?

@""などの空の文字列の最初の文字にアクセスしようとすると(たとえば、NSMakeRangesubstringToIndexなど)、アプリがクラッシュします。これを回避するには、処理する前に存在することを確認する必要があります。

文字列がnilだった場合はどうなりますか?

ニル氏:私は 'nil'です。あなたが私に送ったものは何でも消化できます。アプリを単独でクラッシュさせることはできません。 ;)

Animation of a person swallowing fake explosives, it going off in his stomach, and then smoke coming from his mouth in a cartoonish fashion without injury.

nilは、送信したメソッド呼び出しを監視します。

試してみたものはすべて消化します。nilはあなたの友達です。

NSStringを使用できます:

- (NSString *)capitalizedString

または(iOS 6.0以降):

- (NSString *)capitalizedStringWithLocale:(NSLocale *)locale

90
meaning-matters

これを実現するために使用できると思うステップのリストをドロップします。問題なくフォローできることを願っています! :)

  • decomposedStringWithCanonicalMappingを使用して、アクセントを分解します(アクセント付き文字が不必要に削除されないようにするために重要です)
  • CharacterAtIndex:を使用して最初の文字(インデックス0)を抽出し、upperCaseStringを使用して大文字に変換し、stringByReplacingCharactersInRangeを使用して最初の文字を元の文字列に戻します。
  • このステップでは、大文字に変換する前に、最初の文字が置換したくない文字の1つであるかどうかを確認できます。 「:」または「;」。ある場合は、残りの手順を実行しないでください。
  • [theString stringByReplacingOccurrencesOfString:@" "withString:@" "]`残りのアクセントを削除するための一種の呼び出し。

これはすべて、最初の文字を大文字にし、アクセントを削除する必要があります:)

2
Madhu

IOS 9.0以降、現在のロケールを使用して文字列を大文字にする方法があります。

@property(readonly, copy) NSString *localizedCapitalizedString;
1
ASLLOP

同様の状況でこの方法を使用していますが、質問が他の文字を小文字にするように要求したかどうかはわかりません。

- (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]];
    }
}
1
Josip B.

いくつかのオプションを追加するために、このカテゴリを使用して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);
0
Alejandro Iván