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.
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]];
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.
nil
observera tout appel de méthode que vous lui envoyez.
Donc, il digère tout ce que vous essayez, nil
est votre ami.
Vous pouvez utiliser NSString
's:
- (NSString *)capitalizedString
ou (iOS 6.0 et supérieur):
- (NSString *)capitalizedStringWithLocale:(NSLocale *)locale
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! :)
decomposedStringWithCanonicalMapping
pour décomposer les accents (Important pour vous assurer que les caractères accentués ne sont pas simplement supprimés inutilement)upperCaseString
pour la transformer en lettres capitol et utilisez stringByReplacingCharactersInRange
pour remplacer la première lettre par la chaîne d'origine. [theString stringByReplacingOccurrencesOfString:@"
"withString: @" "]` pour supprimer les accents restants.Tout cela devrait à la fois mettre en majuscule votre première lettre ET supprimer les accents :)
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]];
}
}
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;
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);