【问题标题】:How to capitalize the first letter of a String in Java?如何在Java中将String的第一个字母大写?
【发布时间】:2011-04-23 16:56:01
【问题描述】:

我正在使用 Java 从用户那里获取 String 输入。我正在尝试将此输入的第一个字母大写。

我试过这个:

String name;

BufferedReader br = new InputStreamReader(System.in);

String s1 = name.charAt(0).toUppercase());

System.out.println(s1 + name.substring(1));

导致这些编译器错误:

  • 类型不匹配:无法从 InputStreamReader 转换为 BufferedReader

  • 不能在原始类型 char 上调用 toUppercase()

【问题讨论】:

  • @Pontus - 我不同意。对于输入“abcd”,OP 想要输出“Abcd”。看起来很清楚,尽管这个问题本来可以更好。
  • 字符是Java中的一种原始数据类型。您不能使用 dot(.) 运算符取消引用原始数据类型。您必须通过 name.substring(0,1); 对第一个字符进行子串化
  • 警告:在突厥语字母中,小写字符 i 有两个不同的大写字母,具体取决于所指的单词。见en.wikipedia.org/wiki/Dotted_and_dotless_I

标签: java string capitalize


【解决方案1】:
String str = "java";
String cap = str.substring(0, 1).toUpperCase() + str.substring(1);
// cap = "Java"

用你的例子:

public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    // Actually use the Reader
    String name = br.readLine();
    // Don't mistake String object with a Character object
    String s1 = name.substring(0, 1).toUpperCase();
    String nameCapitalized = s1 + name.substring(1);
    System.out.println(nameCapitalized);
}

【讨论】:

  • 我认为str.length()后面需要-1,否则会越界。
  • @dutt:实际上没有,那也很好。但是Rekin的修改使它变得完美。 ;)
  • commons lang 总是比编写自己的函数更好,除非在极少数情况下你知道得更好。如果您没有阅读关于大写函数的 commons lang java 文档,那么您不应该自己编写。
  • @The.Laughing.Man 并不是每个人都已经将 commons-lang 作为依赖项,这个答案对于想要为单个函数引入新依赖项的人很有用
【解决方案2】:

【讨论】:

  • 我用的是WordUtils,它也有同样的功能,但是它将句子中所有单词的首字母大写。
  • StringUtils.capitalize( "fred from jupiter" ); 产生"Fred from jupiter"。容易...:D
  • WordUtils.capitalizeFully() 像魅力一样为我工作:WordUtils.capitalizeFully("i am FINE") = "I Am Fine"
  • 请注意,当您使用它时,字符串实际上是小写的。我在一个值为 "ATTACHMENT" 的枚举上尝试了它,并希望它是 "Attachment" 。当然它不起作用,因为它将第一个字母“A”大写,这已经是大写了;)。所以首先将你的字符串转换为小写,然后使用这个函数。像魅力一样工作。
【解决方案3】:

将字符串首字母大写的更短/更快的版本代码是:

String name  = "stackoverflow"; 
name = name.substring(0,1).toUpperCase() + name.substring(1).toLowerCase();

name 的值为"Stackoverflow"

【讨论】:

  • 我喜欢这个解决方案,因为它确保字符串的其余部分是小写的。这就是我从 ALL_CAPS 枚举名称转换时所需要的。
【解决方案4】:

使用 Apache 的通用库。让你的大脑从这些东西中解放出来,避免空指针和索引越界异常

第 1 步:

通过将其放入 build.gradle 依赖项中来导入 apache 的通用语言库

compile 'org.apache.commons:commons-lang3:3.6'

第 2 步:

如果你确定你的字符串都是小写的,或者你只需​​要初始化第一个字母,直接调用

StringUtils.capitalize(yourString);

如果您想确保只有第一个字母大写,例如对enum 执行此操作,请先调用toLowerCase(),并记住如果输入字符串为空,它将抛出NullPointerException

StringUtils.capitalize(YourEnum.STUFF.name().toLowerCase());
StringUtils.capitalize(yourString.toLowerCase());

这里是 apache 提供的更多示例。没有例外

StringUtils.capitalize(null)  = null
StringUtils.capitalize("")    = ""
StringUtils.capitalize("cat") = "Cat"
StringUtils.capitalize("cAt") = "CAt"
StringUtils.capitalize("'cat'") = "'cat'"

注意:

WordUtils 也包含在此库中,但已弃用。请不要使用它。

【讨论】:

  • 谢谢。我不敢相信人们甚至会想到使用 for 循环来完成这种任务
  • @Alvaro,归根结底——人们确实使用循环来完成这项任务,检查 apache 源代码。但这并不意味着人们不应该使用经过良好测试的解决方案。
  • @YuriyChernyshov 当然,我的意思是他们不应该为生产代码重新发明轮子
  • WordUtils.capitalizeFully() 像魅力一样为我工作:WordUtils.capitalizeFully("i am FINE") = "I Am Fine"
  • 我永远不会仅仅为了 How to capitalize the first letter of a String in Java? 这样的小目的而使用外部库。
【解决方案5】:

Java:

只是一个帮助每个字符串大写的方法。

public static String capitalize(String str)
{
    if(str == null) return str;
    return str.substring(0, 1).toUpperCase() + str.substring(1);
}

之后只需拨打str = capitalize(str)


科特林:

str.capitalize()

【讨论】:

  • 如果str 为空会抛出异常。使用前检查字符串不为空且至少有一个字符。
  • @attacomsian 你是对的,我更新了 java 代码,对于 Kotlin 你可以使用 str?.capitalize()
【解决方案6】:

如果你使用SPRING

import static org.springframework.util.StringUtils.capitalize;
...


    return capitalize(name);

实现: org/springframework/util/StringUtils.java#L535-L555

参考: javadoc-api/org/springframework/util/StringUtils.html#capitalize


注意:如果您已经有 Apache Common Lang 依赖项,请考虑使用他们的 StringUtils.capitalize 作为其他答案的建议。

【讨论】:

    【解决方案7】:

    你想做的大概是这样的:

    s1 = name.substring(0, 1).toUpperCase() + name.substring(1);
    

    (将第一个字符转换为大写并添加原始字符串的其余部分)

    此外,您创建了一个输入流阅读器,但从未读取任何行。因此name 将永远是null

    这应该可行:

    BufferedReader br = new InputstreamReader(System.in);
    String name = br.readLine();
    String s1 = name.substring(0, 1).toUpperCase() + name.substring(1);
    

    【讨论】:

      【解决方案8】:

      【讨论】:

      • 嗨!您能否解释一下如何在我的项目中实现这一点?我可以在您的 URL 中看到任何文件下载链接。谢谢
      • 此方法已弃用。请使用 commons-lang 中的 StringUtils
      【解决方案9】:

      以下解决方案将起作用。

      String A = "stackOverflow";
      String ACaps = A.toUpperCase().charAt(0)+A.substring(1,A.length());
      //Will print StackOverflow
      

      您不能在原始 char 上使用 toUpperCase() ,但您可以先将整个字符串变为大写,然后取第一个字符,然后附加到子字符串,如上所示。

      【讨论】:

      • toUpperCase 有问题。
      • 有问题的是,他正试图在原语上使用大写字母,这是行不通的。
      • 哦。我错过了那件事。 (y)
      • 亲爱的答案
      【解决方案10】:

      【讨论】:

      • 还应该提到这是哪个库。
      【解决方案11】:
      String str1 = "hello";
      str1.substring(0, 1).toUpperCase()+str1.substring(1);
      

      【讨论】:

        【解决方案12】:

        使用此实用方法获取所有首字母大写。

        String captializeAllFirstLetter(String name) 
        {
            char[] array = name.toCharArray();
            array[0] = Character.toUpperCase(array[0]);
        
            for (int i = 1; i < array.length; i++) {
                if (Character.isWhitespace(array[i - 1])) {
                    array[i] = Character.toUpperCase(array[i]);
                }
            }
        
            return new String(array);
        }
        

        【讨论】:

          【解决方案13】:

          它将工作 101%

          public class UpperCase {
          
              public static void main(String [] args) {
          
                  String name;
          
                  System.out.print("INPUT: ");
                  Scanner scan = new Scanner(System.in);
                  name  = scan.next();
          
                  String upperCase = name.substring(0, 1).toUpperCase() + name.substring(1);
                  System.out.println("OUTPUT: " + upperCase); 
          
              }
          
          }
          

          【讨论】:

          • 如果只按“Enter”会发生什么?如果只输入一个字母会怎样?
          • @koppor 然后它将工作 0%
          【解决方案14】:

          将字符串设置为小写,然后将第一个字母设置为大写,如下所示:

              userName = userName.toLowerCase();
          

          然后将第一个字母大写:

              userName = userName.substring(0, 1).toUpperCase() + userName.substring(1).toLowerCase();
          

          子字符串只是得到一个更大的字符串,然后我们将它们组合在一起。

          【讨论】:

          • 我是如何得到它的,第一行代码是无用的,因为字符串的其余部分都设置为小写。
          【解决方案15】:

          也最短:

          String message = "my message";    
          message = Character.toUpperCase(message.charAt(0)) + message.substring(1);
          System.out.println(message)    // Will output: My message
          

          为我工作。

          【讨论】:

            【解决方案16】:

            这是我关于所有可能选项的主题的详细文章Capitalize First Letter of String in Android

            Java中字符串首字母大写的方法

            public static String capitalizeString(String str) {
                    String retStr = str;
                    try { // We can face index out of bound exception if the string is null
                        retStr = str.substring(0, 1).toUpperCase() + str.substring(1);
                    }catch (Exception e){}
                    return retStr;
            }
            

            KOTLIN中字符串首字母大写的方法

            fun capitalizeString(str: String): String {
                    var retStr = str
                    try { // We can face index out of bound exception if the string is null
                        retStr = str.substring(0, 1).toUpperCase() + str.substring(1)
                    } catch (e: Exception) {
                    }
                    return retStr
            }
            

            【讨论】:

              【解决方案17】:

              在 Android Studio 中

              将此依赖项添加到您的build.gradle (Module: app)

              dependencies {
                  ...
                  compile 'org.apache.commons:commons-lang3:3.1'
                  ...
              }
              

              现在你可以使用

              String string = "STRING WITH ALL CAPPS AND SPACES";
              
              string = string.toLowerCase(); // Make all lowercase if you have caps
              
              someTextView.setText(WordUtils.capitalize(string));
              

              【讨论】:

                【解决方案18】:

                WordUtils.capitalizeFully() 呢?

                import org.apache.commons.lang3.text.WordUtils;
                
                public class Main {
                
                    public static void main(String[] args) {
                
                        final String str1 = "HELLO WORLD";
                        System.out.println(capitalizeFirstLetter(str1)); // output: Hello World
                
                        final String str2 = "Hello WORLD";
                        System.out.println(capitalizeFirstLetter(str2)); // output: Hello World
                
                        final String str3 = "hello world";
                        System.out.println(capitalizeFirstLetter(str3)); // output: Hello World
                
                        final String str4 = "heLLo wORld";
                        System.out.println(capitalizeFirstLetter(str4)); // output: Hello World
                    }
                
                    private static String capitalizeFirstLetter(String str) {
                        return WordUtils.capitalizeFully(str);
                    }
                }
                

                【讨论】:

                  【解决方案19】:

                  您可以使用substring() 来执行此操作。

                  但是有两种不同的情况:

                  案例 1

                  如果您大写的String 是为了便于阅读,您还应该指定默认语言环境:

                  String firstLetterCapitalized = 
                      myString.substring(0, 1).toUpperCase(Locale.getDefault()) + myString.substring(1);
                  

                  案例 2

                  如果您大写的String 是机器可读的,请避免使用Locale.getDefault(),因为返回的字符串在不同区域之间会不一致,在这种情况下,请始终指定相同的语言环境(例如, toUpperCase(Locale.ENGLISH))。这将确保您用于内部处理的字符串是一致的,这将帮助您避免难以发现的错误。

                  注意:您不必为toLowerCase() 指定Locale.getDefault(),因为这是自动完成的。

                  【讨论】:

                    【解决方案20】:

                    你也可以试试这个:

                     String s1 = br.readLine();
                     char[] chars = s1.toCharArray();
                     chars[0] = Character.toUpperCase(chars[0]);
                     s1= new String(chars);
                     System.out.println(s1);
                    

                    这比使用子字符串更好(优化)。 (但不用担心小字符串)

                    【讨论】:

                      【解决方案21】:

                      试试这个

                      这个方法的作用是,考虑单词“hello world”这个方法把它变成“Hello World”,每个单词的开头都大写。

                       private String capitalizer(String word){
                      
                              String[] words = word.split(" ");
                              StringBuilder sb = new StringBuilder();
                              if (words[0].length() > 0) {
                                  sb.append(Character.toUpperCase(words[0].charAt(0)) + words[0].subSequence(1, words[0].length()).toString().toLowerCase());
                                  for (int i = 1; i < words.length; i++) {
                                      sb.append(" ");
                                      sb.append(Character.toUpperCase(words[i].charAt(0)) + words[i].subSequence(1, words[i].length()).toString().toLowerCase());
                                  }
                              }
                              return  sb.toString();
                      
                          }
                      

                      【讨论】:

                      • 但是这段代码似乎很好理解,所有的方法通过它们的名字也很容易理解。但是谢谢你的评论,下次会努力做得更完美,我有一段时间太懒了:-) .
                      • 像魅力一样工作!
                      【解决方案22】:

                      当前的答案要么不正确,要么使这个简单的任务过于复杂。经过一番研究,这里是two approaches我想出的:

                      1.字符串的substring()方法

                      public static String capitalize(String str) {
                          if(str== null || str.isEmpty()) {
                              return str;
                          }
                      
                          return str.substring(0, 1).toUpperCase() + str.substring(1);
                      }
                      

                      例子:

                      System.out.println(capitalize("java")); // Java
                      System.out.println(capitalize("beTa")); // BeTa
                      System.out.println(capitalize(null)); // null
                      

                      2。 Apache Commons 朗

                      Apache Commons Lang 库为此目的提供了 StringUtils 类:

                      System.out.println(StringUtils.capitalize("apache commons")); // Apache commons
                      System.out.println(StringUtils.capitalize("heLLO")); // HeLLO
                      System.out.println(StringUtils.uncapitalize(null)); // null
                      

                      不要忘记将以下依赖项添加到您的 pom.xml 文件中:

                      <dependency>
                          <groupId>org.apache.commons</groupId>
                          <artifactId>commons-lang3</artifactId>
                          <version>3.9</version>
                      </dependency>
                      

                      【讨论】:

                      • StringUtils.capitalize("a")尝试另一个测试。
                      • 这是正确的 - WordUtils.initials("AsdfAsadfg Basdf"");
                      • 用 StringUtils.capitalize("b") Tee-hee 试试另一个测试!!
                      【解决方案23】:

                      简单的解决方案!不需要任何外部库,它可以处理空字符串或一个字母字符串。

                      private String capitalizeFirstLetter(@NonNull  String str){
                              return str.length() == 0 ? str
                                      : str.length() == 1 ? str.toUpperCase()
                                      : str.substring(0, 1).toUpperCase() + str.substring(1).toLowerCase();
                      }
                      

                      【讨论】:

                      • 我并不是说您的回答实际上有什么问题,但我确实在“低质量帖子”审核队列中遇到了它。通常最好在“仅代码”答案中添加一些解释性文本以避免这种情况。
                      • 不确定要添加什么,它非常简单,不需要任何外部库
                      • 这是正确的答案。由于 ArrayOutOfBoundsException,在给出单个字母(例如“b”)时,大多数其他答案都会失败。很遗憾,这个解决方案没有根据 StackOverflow 指南解释任何代码。当然,对于 Java 资深人士来说,解决方案是显而易见的,但对于 Java 相对较新的人来说则不一定如此。
                      【解决方案24】:

                      这只是为了告诉你,你并没有那么错。

                      BufferedReader br = new InputstreamReader(System.in);
                      // Assuming name is not blank
                      String name = br.readLine(); 
                      
                      //No more error telling that you cant convert char to string
                      String s1 = (""+name.charAt(0)).toUppercase());
                      // Or, as Carlos prefers. See the comments to this post.
                      String s1 = Character.toString(name.charAt(0)).toUppercase());
                      
                      System.out.println(s1+name.substring(1));
                      

                      注意: 这根本不是最好的方法。这只是为了向 OP 展示它也可以使用 charAt() 来完成。 ;)

                      【讨论】:

                      • +1 表示“没那么错”。我会更喜欢 Character.toString(name.charAt(0)) 而不是""+name.charAt(0) 来展示我真正想做的事情。
                      • 无空长度检查..长度可能为零。
                      【解决方案25】:

                      这会起作用

                      char[] array = value.toCharArray();
                      
                      array[0] = Character.toUpperCase(array[0]);
                      
                      String result = new String(array);
                      

                      【讨论】:

                        【解决方案26】:

                        您可以使用以下代码:

                        public static void main(String[] args) {
                        
                            capitalizeFirstLetter("java");
                            capitalizeFirstLetter("java developer");
                        }
                        
                        public static void capitalizeFirstLetter(String text) {
                        
                            StringBuilder str = new StringBuilder();
                        
                            String[] tokens = text.split("\\s");// Can be space,comma or hyphen
                        
                            for (String token : tokens) {
                                str.append(Character.toUpperCase(token.charAt(0))).append(token.substring(1)).append(" ");
                            }
                            str.toString().trim(); // Trim trailing space
                        
                            System.out.println(str);
                        
                        }
                        

                        【讨论】:

                          【解决方案27】:

                          给出的答案仅用于将一个单词的第一个字母大写。使用以下代码将整个字符串大写。

                          public static void main(String[] args) {
                              String str = "this is a random string";
                              StringBuilder capitalizedString = new StringBuilder();
                              String[] splited = str.trim().split("\\s+");
                          
                              for (String string : splited) {         
                                  String s1 = string.substring(0, 1).toUpperCase();
                                  String nameCapitalized = s1 + string.substring(1);
                          
                                  capitalizedString.append(nameCapitalized);
                                  capitalizedString.append(" ");
                              }
                              System.out.println(capitalizedString.toString().trim());
                          }
                          

                          输出: This Is A Random String

                          【讨论】:

                            【解决方案28】:

                            如果输入是大写,则使用以下:

                            str.substring(0, 1).toUpperCase() + str.substring(1).toLowerCase();

                            如果输入是小写,则使用以下:

                            str.substring(0, 1).toUpperCase() + str.substring(1);

                            【讨论】:

                              【解决方案29】:

                              使用commons.lang.StringUtils 最佳答案是:

                              public static String capitalize(String str) {  
                                  int strLen;  
                                  return str != null && (strLen = str.length()) != 0 ? (new StringBuffer(strLen)).append(Character.toTitleCase(str.charAt(0))).append(str.substring(1)).toString() : str;  
                              }
                              

                              我觉得它很棒,因为它用 StringBuffer 包装了字符串。您可以根据需要使用相同的实例来操作 StringBuffer。

                              【讨论】:

                                【解决方案30】:

                                现有的答案是

                                • 不正确:他们认为 char 是一个单独的字符(代码点),而它是一个 UTF-16 单词,可以是代理对的一半,或者
                                • 使用本身还不错但需要向项目添加依赖项的库,或者
                                • use Java 8 Streams 完全有效,但并非总是可行。

                                让我们看一下surrogate characters(每个这样的字符都由两个 UTF-16 字组成——Java chars)并且可以有大小写变体:

                                IntStream.rangeClosed(0x01_0000, 0x10_FFFF)
                                    .filter(ch -> Character.toUpperCase(ch) != Character.toLowerCase(ch))
                                    .forEach(ch -> System.out.print(new String(new int[] { ch }, 0, 1)));
                                

                                它们中的许多对您来说可能看起来像“豆腐”(□),但它们大多是稀有脚本的有效字符,并且某些字体支持它们。

                                例如,我们看一下 Deseret Small Letter Long I (?),U+10428,"\uD801\uDC28"

                                System.out.println("U+" + Integer.toHexString(
                                        "\uD801\uDC28".codePointAt(0)
                                )); // U+10428
                                
                                System.out.println("U+" + Integer.toHexString(
                                        Character.toTitleCase("\uD801\uDC28".codePointAt(0))
                                )); // U+10400 — ok! capitalized character is another code point
                                
                                System.out.println("U+" + Integer.toHexString(new String(new char[] {
                                        Character.toTitleCase("\uD801\uDC28".charAt(0)), "\uD801\uDC28".charAt(1)
                                }).codePointAt(0))); // U+10428 — oops! — cannot capitalize an unpaired surrogate
                                

                                因此,即使char 不能大写,代码点也可以大写。 考虑到这一点,让我们编写一个正确的(并且与 Java 1.5 兼容!)大写:

                                @Contract("null -> null")
                                public static CharSequence capitalize(CharSequence input) {
                                    int length;
                                    if (input == null || (length = input.length()) == 0) return input;
                                
                                    return new StringBuilder(length)
                                            .appendCodePoint(Character.toTitleCase(Character.codePointAt(input, 0)))
                                            .append(input, Character.offsetByCodePoints(input, 0, 1), length);
                                }
                                

                                并检查它是否有效:

                                public static void main(String[] args) {
                                    // ASCII
                                    System.out.println(capitalize("whatever")); // w -> W
                                
                                    // UTF-16, no surrogate
                                    System.out.println(capitalize("что-то")); // ч -> Ч
                                
                                    // UTF-16 with surrogate pairs
                                    System.out.println(capitalize("\uD801\uDC28")); // ? -> ?
                                }
                                

                                另见:

                                【讨论】:

                                  猜你喜欢
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2023-03-15
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2018-07-08
                                  • 2015-04-30
                                  • 2015-12-05
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多