Прописная первая буква в NSString - PullRequest
37 голосов
/ 09 сентября 2011

Как я могу прописать первую букву NSString и удалить любые акценты?

Например, Àlter, Alter, alter должно стать Alter.

Но, /lter, )lter, :lter должны оставаться такими же , поскольку первый символ не является буквой.

Ответы [ 7 ]

117 голосов
/ 09 сентября 2011

Пожалуйста, НЕ используйте этот метод.Потому что одна буква может иметь разное количество на разных языках.Вы можете проверить 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?

Mr.Nil: I'm '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твой друг.

91 голосов
/ 20 августа 2013

Вы можете использовать NSString s:

- (NSString *)capitalizedString

или (iOS 6.0 и выше):

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

53 голосов
/ 09 сентября 2011

Поскольку вы хотите удалить диакритические знаки, вы можете использовать этот метод в сочетании с обычными методами работы со строками, например:

/* 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]];
2 голосов
/ 09 сентября 2011

Оставлю список шагов, которые я думаю, вы можете использовать, чтобы сделать это. Надеюсь, что вы можете пройти без проблем! :)

  • Используйте decomposedStringWithCanonicalMapping для разложения любых акцентов (важно убедиться, что акцентированные символы не просто удалены без необходимости)
  • Используйте characterAtIndex: для извлечения первой буквы (индекс 0), используйте upperCaseString, чтобы превратить его в буквы капитолия, и используйте stringByReplacingCharactersInRange, чтобы заменить первую букву обратно в исходную строку.
  • На этом этапе ПЕРЕД превращением его в верхний регистр вы можете проверить, является ли первая буква одним из символов, которые вы не хотите заменять, например, ":" или ";", и если это так, не выполняйте оставшуюся часть процедуры.
  • Выполните [theString stringByReplacingOccurrencesOfString:@" "withString: @" "]` вызов для удаления любых акцентов, оставшихся после.

Это все должно как заглавную букву, так и убрать все акценты:)

1 голос
/ 21 февраля 2017

Начиная с iOS 9.0, существует метод ввода строки с использованием текущей локали:

@property(readonly, copy) NSString *localizedCapitalizedString;
1 голос
/ 25 июля 2016

Я использую этот метод для подобных ситуаций, но я не уверен, если заданный вопрос, чтобы другие буквы были строчными.

- (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]];
    }
}
0 голосов
/ 14 декабря 2016

Просто для добавления некоторых опций, я использую эту категорию, чтобы использовать заглавную букву 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);
...