如何在Java中将字符串的第一个字母大写?

496

我使用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()


2
@Pontus - 我不同意。对于输入“abcd”,OP想要输出“Abcd”。这似乎很清楚,尽管问题可能可以更好地表达。 - Kobi
https://dev59.com/TXI-5IYBdhLWcg3wW3Gp - jmj
字符是Java中的原始数据类型。您不能使用点(.)运算符取消引用原始数据类型。 您必须通过name.substring(0,1)来截取第一个字符。 - Divakar Rajesh
警告:在突厥语字母表中,小写字母i有两个不同的大写字母,取决于所指的单词。请参见https://en.wikipedia.org/wiki/Dotted_and_dotless_I。 - Grim
59个回答

562
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);
}

2
我认为你需要在str.length()后面加上-1,否则你会越界。 - dutt
2
@The.Laughing.Man 并不是每个人都已经将commons-lang作为依赖项,这个答案对于想要为单个函数引入新依赖项的人很有用。 - Nosrep
请注意,此答案可能会产生不正确的结果,因为 str.substring(0, 1) 可能会返回无效的 Unicode 字符串 - https://dev59.com/tFEG5IYBdhLWcg3wOHG1 - Cheok Yan Cheng
@Miha_x64的回答(https://dev59.com/42865IYBdhLWcg3wQMSW#57908029)更加准确。 - Cheok Yan Cheng
使用以下代码:String str = "JAVA"; String cap = str.substring(0, 1).toUpperCase() + str.substring(1).toLowerCase();可以确保字符串的首字母大写,其余字母小写。例如:// str = "JAVA" // cap = "Java" - C.B.
显示剩余2条评论

336

我之前使用的是WordUtils,它也有相同的功能,但它会将句子中所有单词的首字母大写。 - Surbhit Rao
6
StringUtils.capitalize("fred from jupiter"); 会产生 "Fred from jupiter"。很简单... :D - udoline
5
WordUtils.capitalizeFully() 对我来说非常好用,因为它可以将 "i am FINE" 转换成 "I Am Fine"。 - Atul KS
2
请注意,当您使用此功能时,字符串实际上是小写的。我尝试将其用于具有值“ATTACHMENT”的枚举,并希望它成为“Attachment”。当然,它没有起作用,因为它将第一个字母“A”大写了,而这个字母已经是大写的;)。因此,请先将字符串转换为小写,然后再使用此函数。效果非常好。 - Pramod Yadav

144

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

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

name的值为"Stackoverflow"


15
我喜欢这个解决方案,因为它确保字符串的其余部分都是小写字母。在从全大写枚举名称转换时,这正是我所需要的。 - Ellen Spertus
你的解决方案存在问题。有一个句子:“我爱奥巴马”,所以它会变成“I love obama”,这有点令人困惑。可能应该使用标志参数使.toLowerCase()可选,例如public static String capitalize(String string, boolean lowerTheRest [= false]) {... - Vega TV

100

使用Apache的通用库,让您从这些问题中解放出来,避免空指针和数组越界异常

步骤1:

通过在build.gradle依赖项中添加以下内容导入Apache的通用语言库:

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

步骤2:

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

StringUtils.capitalize(yourString);

如果你想确保只有第一个字母大写,比如对enum做这样的操作,先调用toLowerCase(),同时记住如果输入字符串为空(null)它将抛出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也包含在这个库中,但已被弃用。请不要使用它。


WordUtils.capitalizeFully() 对我非常有效,因为它可以将 "i am FINE" 转换为 "I Am Fine"。 - Atul KS

46

45

Java:

这只是一个帮助方法,用于将每个字符串都转换为大写。

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

然后只需调用str = capitalize(str)


Kotlin:

str.capitalize()

1
需要考虑空字符串,否则会导致索引越界错误。 - qrt
对于长度为1的字符串,不要做任何事情。Bug。 - al.zatv

24

您需要做的可能是这样:

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);

19

你好!能请您讲解一下如何在我的项目中实现这个吗?我在您的URL中没有看到任何文件下载链接。谢谢。 - GrayFox
3
该方法已被弃用,请使用commons-lang中的StringUtils。 - Fangming

16

以下解决方案可行。

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

你不能在原始字符上使用 toUpperCase() 方法,但你可以先将整个字符串转换为大写字母然后取第一个字符,再像上面显示的那样附加到子字符串中。


14

使用此实用方法来将每个单词的第一个字母大写。

String capitalizeAllFirstLetters(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);
}

2
逻辑上出现了错误。函数的第一行应该是char[] array = name.toLowerCase().toCharArray();。否则,该函数仅在输入全小写字符串时才能正常工作。 - Jonathan Benn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接