NSString中的大写首字母

时间:2011-09-09 09:05:01

标签: iphone ios uppercase

如何将NSString的fisrt字母大写,并删除任何重音?

例如,ÀlterAlteralter成为 Alter

但是,/lter)lter:lter应保持相同,因为第一个字符不是字母。

7 个答案:

答案 0 :(得分:117)

请不要使用此方法。因为一个字母可能在不同语言中有不同的计数。您可以检查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怎么办?

Mr.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是你的朋友。

答案 1 :(得分:91)

您可以使用NSString

- (NSString *)capitalizedString

或(iOS 6.0及以上版本):

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

答案 2 :(得分:53)

由于您要删除变音符号,您可以将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]];

答案 3 :(得分:2)

要删除我认为可以用来完成这一步骤的步骤列表。希望你能毫无疑问地坚持到底! :)

  • 使用decomposedStringWithCanonicalMapping分解任何重音(重要的是确保重音字符不会被不必要地删除)
  • 使用characterAtIndex:提取第一个字母(索引0),使用upperCaseString将其转换为capitol字母,然后使用stringByReplacingCharactersInRange将第一个字母替换回原始字符串。
  • 在此步骤中,在将其转换为大写之前,您可以检查第一个字母是否是您不想替换的字符之一,例如“:”或“;”,如果是,则不执行其余程序。
  • 执行[theString stringByReplacingOccurrencesOfString:@"“withString:@”“]调用以删除任何留下的重音。

这一切都应该大写你的第一个字母并删除任何重音:)

答案 4 :(得分:1)

我在类似情况下使用此方法,但我不确定是否要求将其他字母设为小写。

- (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]];
    }
}

答案 5 :(得分:1)

从iOS 9.0开始,有一种方法可以使用当前语言环境来大写字符串:

@property(readonly, copy) NSString *localizedCapitalizedString;

答案 6 :(得分:0)

仅仅为了添加一些选项,我使用此类别来大写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);