ios NSString中的大写首字母

uurv41yg  于 2022-12-27  发布在  iOS
关注(0)|答案(7)|浏览(213)

我如何大写NSString的第一个字母,并删除任何重音符号?
例如,ÀlterAlteralter应该变为Alter
但是,/lter)lter:lter应保持相同,因为第一个字符不是字母。

ct2axkht

ct2axkht1#

请不要使用这个方法。因为一个字母在不同的语言中可能有不同的计数。你可以检查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是你的朋友。

mv1qrgav

mv1qrgav2#

您可以使用NSString的:
- (NSString *)capitalizedString
或(iOS 6.0及更高版本):
- (NSString *)capitalizedStringWithLocale:(NSLocale *)locale

1zmg4dgp

1zmg4dgp3#

由于您希望删除发音符号,因此可以将此方法与常见的字符串操作方法结合使用,如下所示:

/* 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]];
xurqigkl

xurqigkl4#

我会列出一系列步骤,我认为你可以用来完成这件事。希望你能毫无疑问地坚持到底

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

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

lkaoscv7

lkaoscv75#

从iOS 9.0开始,有一种方法可以使用当前区域设置大写字符串:

@property(readonly, copy) NSString *localizedCapitalizedString;
2w2cym1i

2w2cym1i6#

我在类似的情况下使用这个方法,但我不确定是否问其他字母小写。

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

nkhmeac67#

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

相关问题