web-dev-qa-db-fra.com

Première lettre en majuscule dans NSString

Comment puis-je mettre la première lettre d'un NSString en majuscule, en supprimant les éventuels accents?

Par exemple, Àlter, Alter, alter devrait devenir Alter.

Cependant, /lter, )lter, :lter devrait rester le même même , car le premier caractère n'est pas une lettre. 

36

Puisque vous voulez supprimer les marques diacritiques, vous pouvez utiliser cette méthode en combinaison avec les méthodes courantes de manipulation de chaînes, comme ceci:

/* 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

S'il vous plaît ne pas utiliser cette méthode. Parce qu'une lettre peut avoir un compte différent dans une langue différente. Vous pouvez vérifier dreamlax answer pour cela. Mais je suis sûr que tu apprendrais quelque chose de ma réponse. Bonne codage :)

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.
}

Pourquoi devrais-je me soucier du nombre de lettres?

Si vous essayez d’accéder (par exemple, NSMakeRange, substringToIndex etc.) le premier caractère d'une chaîne vide comme @"", votre application se plantera. Pour éviter cela, vous devez vérifier qu'il existe avant de le traiter.

Et si ma chaîne était nulle?

Mr.Nil: Je suis 'nul'. Je peux digérer tout ce que vous m'envoyez. Je ne laisserai pas votre application se planter toute seule. ;)

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 observera tout appel de méthode que vous lui envoyez.

Donc, il digère tout ce que vous essayez, nil est votre ami.

90
meaning-matters

Je vais laisser tomber une liste d'étapes que je pense que vous pouvez utiliser pour y arriver. J'espère que vous pourrez suivre sans problème! :)

  • Utilisez decomposedStringWithCanonicalMapping pour décomposer les accents (Important pour vous assurer que les caractères accentués ne sont pas simplement supprimés inutilement)
  • Utilisez characterAtIndex: pour extraire la première lettre (index 0), utilisez upperCaseString pour la transformer en lettres capitol et utilisez stringByReplacingCharactersInRange pour remplacer la première lettre par la chaîne d'origine. 
  • Dans cette étape, AVANT de le mettre en majuscule, vous pouvez vérifier si la première lettre est l’un des caractères que vous ne souhaitez pas remplacer, par exemple. ":" ou ";", et si c'est le cas, ne suivez pas le reste de la procédure.
  • Effectuez un appel [theString stringByReplacingOccurrencesOfString:@" "withString: @" "]` pour supprimer les accents restants.

Tout cela devrait à la fois mettre en majuscule votre première lettre ET supprimer les accents :)

2
Madhu

J'utilise cette méthode pour des situations similaires, mais je ne sais pas si la question est posée pour faire d'autres lettres en minuscule. 

- (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.

Depuis iOS 9.0, il existe une méthode pour capitaliser les chaînes en utilisant les paramètres régionaux actuels:

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

Juste pour ajouter quelques options, j'utilise cette catégorie pour mettre en majuscule la première lettre d'un 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

Et puis vous pouvez simplement appeler:

NSString *helloWorld  = @"hello world";
NSString *capitalized = [helloWorld capitalizeFirst];
NSLog(@"%@ - %@", helloWorld, capitalized);
0
Alejandro Iván