在Java中将字符串的首字母大写

27

截止目前,我正在使用这段代码将字符串中的第一个字母大写。

String output = input.substring(0, 1).toUpperCase() + input.substring(1);

这对我来说看起来很肮脏..有没有直接或优雅的方法..


5
StringUtils.capitalize()是什么?在Java中寻求优雅,嗯,有更好的投资回报率。实用程序库存在的原因。 - Dave Newton
你需要考虑本地化吗?每个本地化都有不同的规则来改变字母的大小写。 - erickson
@erickson 不用了,英文对我来说足够了。 - Suresh Atta
与https://dev59.com/42865IYBdhLWcg3wQMSW相同(尽管这个问题表述更清晰)。 - Jonik
8个回答

53

这样怎么样?

String output = Character.toUpperCase(input.charAt(0)) + input.substring(1);

我想不出在不使用外部库的情况下更干净的方法,但这绝对比你目前拥有的要好。


2
我认为Marco的意思是,""或null会失败;而StringUtils.capitalize不会在这种情况下失败。 - Joop Eggen
2
@JoopEggen 这段代码的行为与原始代码完全相同,而 StringUtils.capitalize 则不然。 - arshajii
1
我甚至不明白为什么这会被踩,我认为这是最好的方法,除非我漏掉了什么。 - TootsieRockNRoll
StringUtils.capitalize("fred from jupiter"); 会产生 "Fred from jupiter"。这就是你所需要的! - udoline

31

你应该查看Apache Commons Lang库中的StringUtils类 - 它有一个名为.capitalize()的方法。

来自该库的描述:

将字符串的第一个字母大写,以标题大小写形式显示,如Character.toTitleCase(char)。其他字母不会改变。


请注意,如果您只想将第一个字母大写(例如,格式化名称),则在运行 capitalize 之前可能需要将整个字符串转为小写,如果您怀疑字符串中可能已经存在大写字母。从 JavaDoc 中可知:StringUtils.capitalize("cAt") = "CAt" - Mark F Guerra
1
大写会将每个单词的第一个字母都大写,而不仅仅是第一个单词。 - FrankMonza
StringUtils.capitalize("fred from jupiter"); 会产生 "Fred from jupiter"。这个方法只会让字符串的第一个字符变成大写字母。 - udoline

2
String out = Character.toUpperCase(inText.charAt(0)) + inText.substring(1).toLowerCase();

0

在这里,看我的

String foo = "suresh";
String bar = foo.toUpperCase();
if(bar.charAt[0] == 'S'){
   throw new SuccessException("bar contains 'SURESH' and has the first letter capital").
}

0
Character.toString(a.charAt(0)).toUpperCase()+a.substring(1)

P.S = a 是字符串。


0

假设您可以使用Java 8,这是一种没有人询问的函数式方法...

import java.util.Optional;
import java.util.stream.IntStream;

public class StringHelper {
    public static String capitalize(String source) {
        return Optional.ofNullable(source)
            .map(str -> IntStream.concat(
                str.codePoints().limit(1).map(Character::toUpperCase),
                str.codePoints().skip(1)))
            .map(stream -> stream.toArray())
            .map(arr -> new String(arr, 0, arr.length))
            .orElse(null);
    }
}

它的优雅之处在于处理空值和空字符串情况时不需要任何条件语句。


StringUtils.capitalize("fred from jupiter"); 会产生 "Fred from jupiter"。这是更少的源代码... :D - udoline

0
public static void main(String[] args) {
    String str = null;
    String outStr = null;
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter a String: ");
    str = sc.nextLine();
    //c= Character.toUpperCase(str.charAt(0));

    for(int i=0; i< (str.length());i++){

        if(str.charAt(i)==' '){

            outStr= outStr.substring(0,i+1)+str.substring(i+1,i+2).toUpperCase()+str.substring(i+2);

        }else if(i==0){

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

        }
    }
    System.out.println("STRING::"+outStr);
}

如果我输入一个以空格开头的字符串 _123,它会抛出 NullPointerException。相比其他答案,你的回答似乎也有点复杂。 - pzaenger
不仅如此,如果在末尾添加空格,我的程序还应该抛出NullPointerException异常。我没有进行这些检查,如果您想的话可以使用正则表达式...我只是提供了一个实现的框架。 - Anubhav

-2
class strDemo3
{
    public static void main(String args[])
    {
        String s1=new String(" the ghost of the arabean sea");
        char c1[]=new char[30];       
        int c2[]=new int[30];
        s1.getChars(0,28,c1,0);
        for(int i=0;i<s1.length();i++)
        {
           System.out.print(c1[i]);
        }
        for(int i=1;i<s1.length();i++)
        {
           c2[i]=c1[i];
           if(c1[i-1]==' ')
           {
               c2[i]=c2[i]-32;
           }
           c1[i]=(char)c2[i];          
        }
        for(int i=0;i<s1.length();i++)
        {
           System.out.print(c1[i]);
        }            
       }
}

1
请不要只发布可能对提问者难以理解的代码。请逐步解释您的答案并给出建议。 - mastov
现在我的代码看起来更美丽了 :) 虽然感谢你的答案。 - Suresh Atta

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