Làm cách nào để viết hoa chữ cái đầu tiên trong chuỗi bằng Java?


223

Chuỗi ví dụ

one thousand only
two hundred
twenty
seven

Làm cách nào để thay đổi ký tự đầu tiên của chuỗi trong chữ in hoa và không thay đổi trường hợp của bất kỳ chữ cái nào khác?

Sau khi thay đổi, nên là:

One thousand only
Two hundred
Twenty
Seven

Lưu ý: Tôi không muốn sử dụng apache.commons.lang.WordUtils để làm điều này.


1
@eat_a_lemon: tốt hơn nhiều khi sử dụng Character.toUpperCase (), vì nó xử lý các trường hợp khác ngoài az (ví dụ: số, dấu chấm câu, chữ cái có dấu phụ, ký tự không phải là tiếng Latinh).
Simon Nickerson

Câu trả lời:


544

Nếu bạn chỉ muốn viết hoa chữ cái đầu tiên của chuỗi có tên inputvà để phần còn lại một mình:

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

Bây giờ outputsẽ có những gì bạn muốn. Kiểm tra xem bạn inputcó ít nhất một ký tự trước khi sử dụng cái này không, nếu không bạn sẽ có ngoại lệ.


37
Ngoài ra, trước tiên tôi sẽ lấy toàn bộ đầu vào và làm cho chữ thường hoặc làm lại ví dụ của bạn như sau: String output = input.subopes (0, 1) .toUpperCase () + input.subopes (1) .toLowerCase ();
David Brossard

2
Và bạn muốn kiểm tra độ dài của chuỗi, vì nó có thể là 1 chuỗi ký tự hoặc thậm chí là 0.
Marek

1
Tôi đã tìm thấy điều này ở đây để tạo tên getter và setter, do đó, LowerCase trên phần còn lại của Chuỗi sẽ phá vỡ việc đặt tên trường. Trả lời là hoàn hảo cho tôi.
kaiser

85
public String capitalizeFirstLetter(String original) {
    if (original == null || original.length() == 0) {
        return original;
    }
    return original.substring(0, 1).toUpperCase() + original.substring(1);
}

Chỉ là ... một giải pháp hoàn chỉnh, tôi thấy nó vừa kết thúc kết hợp những gì mọi người khác đã đăng = P.


12
Đẹp. Tôi "một lớp" nó: return original.length() == 0 ? original : original.substring(0, 1).toUpperCase() + original.substring(1);
mharper

2
@mharper : if length() == 0, chúng ta không thể nói rằng đó là an toàn ""và trả lại thay vì original? Lưu chúng tôi một vài ký tự trong một lót. Tôi hỏi bởi vì tôi cảm thấy như Java là một ngôn ngữ chứa rất nhiều gotcha, tôi thực sự sẽ không ngạc nhiên nếu có một cách khác để có một chuỗi có độ dài bằng không.
ArtOfWarfare 3/03/2015

Bạn nói tất cả sự thật @ArtOfWarfare.
mharper

Lưu ý: bạn cũng có thể muốn làm cho nó hoạt động với các chữ cái không phải tiếng Anh. Trong trường hợp đó, bạn nên chỉ định miền địa phương trong phương thức toUpperCase ().
Makalele

Không thể sử dụng String.toUpperCase(Locale)cho một chuỗi tùy ý, vì Địa điểm phải khớp với văn bản. Vâng, nó nên được sử dụng, nhưng không phải lúc nào cũng rõ ràng Localenên sử dụng ...
Christopher Schultz

81

Cách đơn giản nhất là sử dụng org.apache.commons.lang.StringUtilslớp

StringUtils.capitalize(Str);


8
Ít lưu ý phụ ở đây. Nó chỉ hoạt động cho các chuỗi chưa được viết hoa.
jobbert

5
@jobbert Hãy làm rõ nhận xét của bạn. Nếu các chuỗi đã được viết hoa, nó sẽ không được cấp phép cho các chuỗi mặc dù là một phương thức được đặt tên capitalize?
Cœur

25

Ngoài ra, có org.springframework.util.StringUtilstrong Spring Framework :

StringUtils.capitalize(str);


6
String sentence = "ToDAY   WeAthEr   GREat";    
public static String upperCaseWords(String sentence) {
        String words[] = sentence.replaceAll("\\s+", " ").trim().split(" ");
        String newSentence = "";
        for (String word : words) {
            for (int i = 0; i < word.length(); i++)
                newSentence = newSentence + ((i == 0) ? word.substring(i, i + 1).toUpperCase(): 
                    (i != word.length() - 1) ? word.substring(i, i + 1).toLowerCase() : word.substring(i, i + 1).toLowerCase().toLowerCase() + " ");
        }

        return newSentence;
    }
//Today Weather Great

Điều này không trả lời câu hỏi của OP. Vì nó thay đổi trường hợp của các chữ cái khác.
Liêuwe Rooijakkers

Nhìn vào câu hỏi. Có lẽ, bạn đã không nhận được câu hỏi tốt.
Samet ÖZTOPRAK

3
String s=t.getText().trim();
int l=s.length();
char c=Character.toUpperCase(s.charAt(0));
s=c+s.substring(1);
for(int i=1; i<l; i++)
    {
        if(s.charAt(i)==' ')
        {
            c=Character.toUpperCase(s.charAt(i+1));
            s=s.substring(0, i) + c + s.substring(i+2);
        }
    }
    t.setText(s);

2
Điều này sẽ viết hoa chữ cái đầu tiên của mỗi từ, không phải của toàn bộ chuỗi. Xem các ví dụ được cung cấp bởi OP. Ngoài ra có thể có vấn đề nếu có một khoảng trống ở cuối chuỗi.
tobias_k

2

Ở đây bạn đi (hy vọng điều này cung cấp cho bạn ý tưởng):

/*************************************************************************
 *  Compilation:  javac Capitalize.java
 *  Execution:    java Capitalize < input.txt
 * 
 *  Read in a sequence of words from standard input and capitalize each
 *  one (make first letter uppercase; make rest lowercase).
 *
 *  % java Capitalize
 *  now is the time for all good 
 *  Now Is The Time For All Good 
 *  to be or not to be that is the question
 *  To Be Or Not To Be That Is The Question 
 *
 *  Remark: replace sequence of whitespace with a single space.
 *
 *************************************************************************/

public class Capitalize {

    public static String capitalize(String s) {
        if (s.length() == 0) return s;
        return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
    }

    public static void main(String[] args) {
        while (!StdIn.isEmpty()) {
            String line = StdIn.readLine();
            String[] words = line.split("\\s");
            for (String s : words) {
                StdOut.print(capitalize(s) + " ");
            }
            StdOut.println();
        }
    }

}

và không thay đổi trường hợp của các chữ cái khác. Ngoài ra việc bạn sử dụng StdInStdOutkhông phải là Java-y. :-)
Simon Nickerson

2

Nó đơn giản chỉ cần một dòng mã cho việc này. nếu String A = scanner.nextLine(); sau đó bạn cần phải viết này để hiển thị chuỗi với chữ cái đầu tiên được viết hoa.

System.out.println(A.substring(0, 1).toUpperCase() + A.substring(1));

Và nó được thực hiện bây giờ.


1

Ví dụ sử dụng lớp StringTokenizer:

String st = "  hello all students";
String st1;
char f;
String fs="";
StringTokenizer a= new StringTokenizer(st);
while(a.hasMoreTokens()){   
        st1=a.nextToken();
        f=Character.toUpperCase(st1.charAt(0));
        fs+=f+ st1.substring(1);
        System.out.println(fs);
} 

1

Giải pháp với StringBuilder:

value = new StringBuilder()
                .append(value.substring(0, 1).toUpperCase())
                .append(value.substring(1))
                .toString();

.. dựa trên các câu trả lời trước


1

Thêm tất cả mọi thứ lại với nhau, đó là một ý tưởng tốt để cắt thêm khoảng trắng ở đầu chuỗi. Nếu không, .sub chuỗi (0,1) .toUpperCase sẽ cố gắng viết hoa một khoảng trắng.

    public String capitalizeFirstLetter(String original) {
        if (original == null || original.length() == 0) {
            return original;
        }
        return original.trim().substring(0, 1).toUpperCase() + original.substring(1);
    }

1

Cách tiếp cận chức năng của tôi. capstilise ký tự đầu tiên của nó trong câu sau whitescape trong toàn bộ đoạn.

Đối với capatilising chỉ ký tự đầu tiên của từ, chỉ cần xóa .split ("")

           b.name.split(" ")
                 .filter { !it.isEmpty() }
                 .map { it.substring(0, 1).toUpperCase() 
                 +it.substring(1).toLowerCase() }
                  .joinToString(" ")

1

Cập nhật tháng 7 năm 2019

Hiện tại, chức năng thư viện cập nhật nhất để thực hiện việc này được chứa trong org.apache.commons.lang3.StringUtils

import org.apache.commons.lang3.StringUtils;

StringUtils.capitalize(myString);

Nếu bạn đang sử dụng Maven, hãy nhập phụ thuộc vào tệp pom.xml của bạn:

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

1

Ngay cả đối với mã "đơn giản", tôi sẽ sử dụng các thư viện. Điều này không phải là mã mỗi se, mà là các trường hợp thử nghiệm đã tồn tại bao gồm các trường hợp ngoại lệ. Điều này có thể là null, chuỗi rỗng, chuỗi trong các ngôn ngữ khác.

Phần thao tác từ đã được chuyển ra khỏi Apache Commons Lang. Bây giờ nó được đặt trong Văn bản Apache Commons . Nhận nó qua https://search.maven.org/artifact/org.apache.commons/commons-text .

Bạn có thể sử dụng WordUtils.capitalize (Chuỗi str) từ Văn bản Apache Commons. Nó mạnh hơn bạn yêu cầu. Nó cũng có thể viết hoa (ví dụ: sửa lỗi"oNe tousand only" ).

Vì nó hoạt động trên văn bản hoàn chỉnh, người ta phải bảo nó chỉ viết hoa từ đầu tiên.

WordUtils.capitalize("one thousand only", new char[0]);

Lớp JUnit đầy đủ để cho phép chơi với chức năng:

package io.github.koppor;

import org.apache.commons.text.WordUtils;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class AppTest {

  @Test
  void test() {
    assertEquals("One thousand only", WordUtils.capitalize("one thousand only", new char[0]));
  }

}

1

nếu bạn chỉ muốn viết hoa chữ cái đầu tiên thì có thể sử dụng đoạn mã dưới đây

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

1

Trên thực tế, bạn sẽ có được hiệu suất tốt nhất nếu bạn tránh được +toán tử và sử dụng concat()trong trường hợp này. Đây là tùy chọn tốt nhất để hợp nhất chỉ 2 chuỗi (mặc dù không tốt cho nhiều chuỗi). Trong trường hợp đó, mã sẽ trông như thế này:

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

0

Dùng cái này:

char[] chars = {Character.toUpperCase(A.charAt(0)), 
Character.toUpperCase(B.charAt(0))};
String a1 = chars[0] + A.substring(1);
String b1 = chars[1] + B.substring(1);

0

Cho inputchuỗi:

Character.toUpperCase(input.charAt(0)) + input.substring(1).toLowerCase()

0

Bạn có thể thử đoạn mã sau:

public string capitalize(str) {
    String[] array = str.split(" ");
    String newStr;
    for(int i = 0; i < array.length; i++) {
        newStr += array[i].substring(0,1).toUpperCase() + array[i].substring(1) + " ";
    }
    return newStr.trim();
}

0
public static String capitalize(String str){
        String[] inputWords = str.split(" ");
        String outputWords = "";
        for (String word : inputWords){
            if (!word.isEmpty()){
                outputWords = outputWords + " "+StringUtils.capitalize(word);
            }
        }
        return outputWords;
    }

0

Tôi muốn thêm một kiểm tra NULL và IndexOutOfBoundException vào câu trả lời được chấp nhận.

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

Mã Java:

  class Main {
      public static void main(String[] args) {
        System.out.println("Capitalize first letter ");
        System.out.println("Normal  check #1      : ["+ captializeFirstLetter("one thousand only")+"]");
        System.out.println("Normal  check #2      : ["+ captializeFirstLetter("two hundred")+"]");
        System.out.println("Normal  check #3      : ["+ captializeFirstLetter("twenty")+"]");
        System.out.println("Normal  check #4      : ["+ captializeFirstLetter("seven")+"]");

        System.out.println("Single letter check   : ["+captializeFirstLetter("a")+"]");
        System.out.println("IndexOutOfBound check : ["+ captializeFirstLetter("")+"]");
        System.out.println("Null Check            : ["+ captializeFirstLetter(null)+"]");
      }

      static String captializeFirstLetter(String input){
             if(input!=null && input.length() >0){
                input = input.substring(0, 1).toUpperCase() + input.substring(1);
            }
            return input;
        }
    }

Đầu ra:

Normal  check #1      : [One thousand only]
Normal  check #2      : [Two hundred]
Normal  check #3      : [Twenty]
Normal  check #4      : [Seven]
Single letter check   : [A]
IndexOutOfBound check : []
Null Check            : [null]

0

Sau đây sẽ cung cấp cho bạn cùng một đầu ra nhất quán bất kể giá trị của inputString của bạn là gì:

if(StringUtils.isNotBlank(inputString)) {
    inputString = StringUtils.capitalize(inputString.toLowerCase());
}

0

1. Sử dụng substring()phương thức của String

public static String capitalize(String str) {
    if(str== null || str.isEmpty()) {
        return str;
    }

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

Bây giờ chỉ cần gọi capitalize()phương thức để chuyển đổi chữ cái đầu tiên của chuỗi thành chữ hoa:

System.out.println(capitalize("stackoverflow")); // Stackoverflow
System.out.println(capitalize("heLLo")); // HeLLo
System.out.println(capitalize(null)); // null

2. Apache Commons Lang

Các StringUtilslớp từ Commons Lang cung cấp các capitalize()phương pháp đó cũng có thể được sử dụng cho mục đích này:

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

Thêm phụ thuộc sau vào pom.xmltệp của bạn (chỉ dành cho Maven):

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

Dưới đây là một bài viết giải thích chi tiết hai cách tiếp cận này.


-1
class Test {
     public static void main(String[] args) {
        String newString="";
        String test="Hii lets cheCk for BEING String";  
        String[] splitString = test.split(" ");
        for(int i=0; i<splitString.length; i++){
            newString= newString+ splitString[i].substring(0,1).toUpperCase() 
                    + splitString[i].substring(1,splitString[i].length()).toLowerCase()+" ";
        }
        System.out.println("the new String is "+newString);
    }
 }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.