【问题标题】:Uppercase first letter in NSStringNSString 中的大写首字母
【发布时间】:2011-11-13 15:12:34
【问题描述】:

如何将 NSString 的第一个字母大写,并去除重音符号?

例如,ÀlterAlteralter 应该变为Alter

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

【问题讨论】:

    标签: iphone ios uppercase


    【解决方案1】:

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

    @property(readonly, copy) NSString *localizedCapitalizedString;
    

    【讨论】:

      【解决方案2】:

      只是为了添加一些选项,我使用此类别将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);
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          请不要使用这种方法。因为一个字母在不同的语言中可能有不同的计数。你可以检查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'。我可以消化你发给我的任何东西。我不会让您的应用自行崩溃。 ;)

          nil 将观察您发送给它的任何方法调用。

          所以它会消化你尝试的任何东西,nil 是你的朋友。

          【讨论】:

          • capitalisedString 已经只改变了第一个字母,所以选择它是没有用的。问题是它不会删除重音符号。谢谢
          • capitalizedString 将 NSString 中每个单词的首字母大写。此答案对于仅将句子的第一个字母大写很有用。
          • 投反对票。虽然很简单,但解决方法是错误的。想象一下这样一种情况,几个字母应该大写而不是只大写第一个。这里的一个很好的例子是荷兰语及其 IJ 对。在大写方面,您应该始终使用语言环境。
          • 也被否决了,这并不能完全回答 OP 的问题。这仅将第一个字符大写,但不删除变音符号。
          • 使用硬编码的NSMakeRange(0,1) 是不正确的(因为第一个字母可能跨越多个字符)。请在@dreamlax 的答案中查看我的评论以获取解决方案。
          【解决方案5】:

          你可以使用NSString的:

          - (NSString *)capitalizedString

          或(iOS 6.0 及以上):

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

          【讨论】:

          • capitalizedString 自 iOS 2.0 起可用
          • 这里所有的字母都小写,第一个只有大写
          • @VanDuTran:除了它没有完全回答 OPs 问题(指定删除任何重音)。
          • 这个解决方案有一个潜在的问题:对于给定的字符串_whatever,它会被转换成_Whatever
          【解决方案6】:

          我将删除我认为您可以用来完成此任务的步骤列表。希望你能顺利完成! :)

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

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

            • 投反对票。某些语言,例如荷兰语,有二合字母,如 IJ,因此需要两个字母大写:en.wikipedia.org/wiki/Capitalization
            • @AliakseiN.:原始问题中没有指定。 OP 想删除变音符号并只大写第一个字母,所以我认为他/她不想保留任何特定于语言环境的拼写法。
            • 这段代码有一个小错误,它假定第一个字母是 1 个字符长,这对于 UTF 字符串是不正确的。相反,它应该调用NSString *firstChar = [input substringWithRange:[input rangeOfComposedCharacterSequenceAtIndex:0]],然后使用[input substringFromIndex:firstChar.length]
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-29
            • 2011-05-14
            • 1970-01-01
            • 2011-06-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多