จะใช้อักษรตัวแรกของ String ใน Java ได้อย่างไร


305

ฉันใช้ 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

  • ไม่สามารถเรียกใช้ตัวพิมพ์ใหญ่ () บนถ่านประเภทดั้งเดิม


2
@Pontus - ฉันไม่เห็นด้วย สำหรับอินพุต "abcd" OP ต้องการเอาต์พุต "Abcd" ดูเหมือนชัดเจนทีเดียวถึงแม้คำถามจะดีขึ้นก็ตาม
Kobi


character เป็นชนิดข้อมูลดั้งเดิมใน Java คุณไม่สามารถระบุชนิดข้อมูลดั้งเดิมด้วยตัวดำเนินการ dot (.) คุณต้องซับสตริงอักขระตัวแรกตาม name.substring (0,1);
Divakar Rajesh

คำตอบ:


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

1
ฉันคิดว่าคุณต้องการ -1 หลังจาก str.length () มิฉะนั้นคุณจะออกนอกขอบเขต
dutt

@dutt: ไม่จริงนั่นก็ดีเหมือนกัน แต่การดัดแปลงของ Rekin ทำให้มันสมบูรณ์แบบ ;)
Adeel Ansari

คอมมอนส์ lang จะดีกว่าการเขียนฟังก์ชั่นของคุณเองยกเว้นในบางกรณีที่คุณรู้ดีกว่า หากคุณไม่ได้ไปอ่านคอมมอนส์ lang java doc ในฟังก์ชันตัวพิมพ์ใหญ่คุณไม่ควรเขียนด้วยตัวเอง
The

211

ฉันใช้ WordUtils มันมีฟังก์ชั่นเหมือนกัน แต่มันใช้อักษรตัวแรกของทุกคำในประโยค
Surbhit Rao

StringUtils.capitalize( "fred from jupiter" );"Fred from jupiter"ผลิต ง่าย ... : D
udoline

WordUtils.capitalizeFully () ทำงานให้ฉันเหมือนมีเสน่ห์ตามที่ให้: WordUtils.capitalizeFully ("ฉันคือ FINE") = "ฉันสบายดี"
Atul Sharma

91

รหัสรุ่นสั้น / เร็วขึ้นเพื่อใช้อักษรตัวแรกของสตริงให้เป็นตัวพิมพ์ใหญ่คือ:

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

ค่าของnameคือ"Stackoverflow"


4
ฉันชอบโซลูชันนี้เพราะทำให้แน่ใจว่าสตริงที่เหลือเป็นตัวพิมพ์เล็ก นั่นคือสิ่งที่ฉันต้องการเมื่อแปลงจากชื่อ enum ALL_CAPS
Ellen Spertus

54

ใช้ไลบรารีทั่วไปของ Apache ปลดปล่อยสมองของคุณจากสิ่งเหล่านี้และหลีกเลี่ยง Null Pointer & Index Out Of Bound Exceptions

ขั้นตอนที่ 1:

นำเข้าไลบรารี lang ทั่วไปของ apache โดยใส่สิ่งนี้ในการbuild.gradleอ้างอิง

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ยังรวมอยู่ในไลบรารีนี้ แต่เลิกใช้แล้ว กรุณาอย่าใช้มัน


2
ขอบคุณ ฉันไม่อยากจะเชื่อว่าผู้คนจะนึกถึงการใช้ลูปสำหรับงานประเภทนี้
อัลวาโร

@Alvaro ในตอนท้ายของวัน - คนใช้วนรอบสำหรับงานนี้ตรวจสอบรหัสที่มา apache นี่ไม่ได้หมายความว่าผู้คนไม่ควรใช้โซลูชันที่ผ่านการทดสอบมาอย่างดี
Yuriy Chernyshov

@ YuriyChernyshov แน่ใจว่าฉันหมายความว่าพวกเขาไม่ควรที่จะคิดค้นล้อสำหรับรหัสการผลิตส่วนใหญ่
Alvaro

WordUtils.capitalizeFully () ทำงานให้ฉันเหมือนมีเสน่ห์ตามที่ให้: WordUtils.capitalizeFully ("ฉันสบายดี") = "ฉันสบายดี"
Atul Sharma

How to capitalize the first letter of a String in Java?ฉันจะไม่ไปสำหรับห้องสมุดภายนอกเพียงเพื่อวัตถุประสงค์เล็กน้อยเช่น
Stack Overflow

25

Java:

เพียงวิธีการช่วยเหลือสำหรับการใช้ประโยชน์ทุกสตริง

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

หลังจากนั้นก็โทร str = capitalize(str)


Kotlin:

str.capitalize()

มันจะโยนข้อยกเว้นถ้าstrเป็นโมฆะ ตรวจสอบว่าสตริงนั้นไม่ใช่ null และมีอักขระอย่างน้อยหนึ่งตัวก่อนใช้งาน
attacomsian

@attacomsian คุณพูดถูกฉันจะอัปเดตรหัสจาวาและสำหรับ Kotlin คุณสามารถใช้ str? .apapitalize ()
Amir Hossein Ghasemi

22

สิ่งที่คุณต้องการทำน่าจะเป็นสิ่งนี้:

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

(แปลงอักขระตัวแรกเป็นตัวพิมพ์ใหญ่และเพิ่มส่วนที่เหลือของสตริงเดิม)

นอกจากนี้คุณสร้างตัวอ่านสตรีมอินพุต แต่อย่าอ่านบรรทัดใด ๆ ดังนั้นจะเป็นnamenull

สิ่งนี้น่าจะใช้ได้:

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

16

WordUtils.capitalize(java.lang.String)จากApache คอมมอนส์


Hi! คุณช่วยอธิบายวิธีการนำสิ่งนี้ไปใช้ในโครงการของฉันได้ไหม ฉันเห็นลิงค์ดาวน์โหลดไฟล์ใด ๆ ใน URL ของคุณ ขอบคุณ
GrayFox

วิธีนี้เลิกใช้แล้ว โปรดใช้ StringUtils จาก commons-lang
Fangming

12

วิธีการแก้ปัญหาด้านล่างจะทำงาน

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

คุณไม่สามารถใช้ toUpperCase () บนถ่านแบบดั้งเดิม แต่คุณสามารถทำให้ทั้งสตริงเป็นตัวพิมพ์ใหญ่ก่อนแล้วจึงใช้ถ่านตัวแรกจากนั้นจึงผนวกไปยังสตริงย่อยตามที่แสดงไว้ด้านบน


toUpperCase ถูก จำกัด ในคำถาม
Harpreet Sandhu - TheRootCoder

ในคำถามเขาพยายามที่จะใช้ UpperCase ในแบบดั้งเดิมซึ่งไม่สามารถใช้งานได้
Jijil Kakkadathu

1
โอ้ ฉันพลาดสิ่งนั้น (y)
Harpreet Sandhu - TheRootCoder

1
คำตอบที่ดีที่รัก
Dulaj Kulathunga


7

สั้นเกินไป:

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

ทำงานให้ฉัน


6

ตั้งค่าสตริงเป็นตัวพิมพ์เล็กจากนั้นตั้งค่าตัวอักษรตัวแรกเป็นตัวบนดังนี้:

    userName = userName.toLowerCase();

จากนั้นให้พิมพ์อักษรตัวแรกเป็นตัวพิมพ์ใหญ่:

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

ซับสตริงเพิ่งได้ชิ้นส่วนของสตริงที่มีขนาดใหญ่ขึ้นจากนั้นเราจะรวมมันกลับเข้าด้วยกัน


7
ฉันจะเข้าใจได้อย่างไรบรรทัดแรกของโค้ดไม่มีประโยชน์เนื่องจากสตริงที่เหลือถูกตั้งค่าเป็นตัวพิมพ์เล็กทั้งสองวิธี
HåvardNygård

6

แล้ว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);
    }
}

6

ใช้วิธีการยูทิลิตี้นี้เพื่อรับตัวอักษรตัวแรกทั้งหมดในเมืองหลวง

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


4

คุณสามารถลองสิ่งนี้:

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

วิธีนี้จะดีกว่า (ปรับให้เหมาะสม) มากกว่าการใช้สตริงย่อย (แต่ไม่ต้องกังวลกับสตริงเล็ก ๆ )


4

คุณสามารถใช้substring()การทำเช่นนี้

แต่มีสองกรณีที่แตกต่างกัน:

กรณีที่ 1

หากStringคุณกำลังใช้ตัวพิมพ์ใหญ่ให้สามารถอ่านได้โดยมนุษย์คุณควรระบุตำแหน่งที่ตั้งเริ่มต้นด้วย:

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

กรณีที่ 2

หากStringคุณกำลังใช้ตัวพิมพ์ใหญ่ให้สามารถอ่านได้ด้วยเครื่องให้หลีกเลี่ยงการใช้Locale.getDefault()เนื่องจากสตริงที่ส่งคืนจะไม่สอดคล้องกันในแต่ละภูมิภาคและในกรณีนี้ให้ระบุโลแคลเดิมเสมอ (เช่นtoUpperCase(Locale.ENGLISH)) สิ่งนี้จะช่วยให้มั่นใจได้ว่าสายอักขระที่คุณใช้สำหรับการประมวลผลภายในนั้นมีความสอดคล้องกันซึ่งจะช่วยให้คุณหลีกเลี่ยงข้อบกพร่องที่ยากต่อการค้นหา

หมายเหตุ: คุณไม่จำเป็นต้องระบุLocale.getDefault()สำหรับการtoLowerCase()เช่นนี้จะทำโดยอัตโนมัติ


4

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

4

ถ้าคุณใช้SPRING :

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


    return capitalize(name);

หมายเหตุ:หากคุณมีการพึ่งพา Apache Common Lang อยู่แล้วให้พิจารณาใช้ StringUtils.capitalize ของพวกเขาตามคำแนะนำอื่น ๆ

การดำเนินการ: https://github.com/spring-projects/spring-framework/blob/64440a5f04a17b3728234afaa89f57766768decb/spring-core/src/main/java/org/springframework/utilStat555

การอ้างอิง: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/StringUtils.html#capitalize-java.lang.String-


4

จะทำงานได้ 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); 

    }

}

3

นี่เป็นเพียงการแสดงให้คุณเห็นว่าคุณไม่ใช่คนผิด

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
+1 สำหรับ "ไม่ผิด" ฉันต้องการ Character.toString(name.charAt(0))แทนที่จะ""+name.charAt(0)แสดงสิ่งที่ฉันต้องการจะทำจริงๆ
user85421

ไม่มีการตรวจสอบความยาว null .. ความยาวอาจเป็นศูนย์
Chrispix


3

คุณสามารถใช้รหัสต่อไปนี้:

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

}

3

ลองอันนี้

สิ่งที่วิธีนี้ทำคือให้พิจารณาคำว่า "สวัสดีโลก" วิธีนี้เปลี่ยนเป็น "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();

    }

แต่ดูเหมือนว่ารหัสนี้จะเข้าใจได้ค่อนข้างดีวิธีการทั้งหมดนั้นง่ายต่อการเข้าใจโดยชื่อของพวกเขา แต่ขอบคุณสำหรับความคิดเห็นของคุณจะพยายามทำให้สมบูรณ์แบบมากขึ้นในครั้งต่อไปฉันจะขี้เกียจเวลา :-)
Ameen Maheen

ทำงานเหมือนจับใจ!
TheVinceble

3

คำตอบที่ให้นั้นใช้อักษรตัวแรกของคำเดียวเท่านั้น ใช้รหัสต่อไปนี้เพื่อใช้ประโยชน์ทั้งสตริง

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


3

หาก Input เป็น UpperCase ให้ใช้คำสั่งต่อไปนี้:

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

หาก Input เป็น LowerCase ให้ใช้สิ่งต่อไปนี้:

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



2
public static String capitalizer(final String texto) {

    // split words
    String[] palavras = texto.split(" ");
    StringBuilder sb = new StringBuilder();

    // list of word exceptions
    List<String> excessoes = new ArrayList<String>(Arrays.asList("de", "da", "das", "do", "dos", "na", "nas", "no", "nos", "a", "e", "o", "em", "com"));

    for (String palavra : palavras) {

        if (excessoes.contains(palavra.toLowerCase()))
            sb.append(palavra.toLowerCase()).append(" ");
        else
            sb.append(Character.toUpperCase(palavra.charAt(0))).append(palavra.substring(1).toLowerCase()).append(" ");
    }
    return sb.toString().trim();
}

2

คุณสามารถใช้รหัสต่อไปนี้:

public static String capitalizeString(String string) {

    if (string == null || string.trim().isEmpty()) {
        return string;
    }
    char c[] = string.trim().toLowerCase().toCharArray();
    c[0] = Character.toUpperCase(c[0]);

    return new String(c);

}

ตัวอย่างการทดสอบกับ JUnit:

@Test
public void capitalizeStringUpperCaseTest() {

    String string = "HELLO WORLD  ";

    string = capitalizeString(string);

    assertThat(string, is("Hello world"));
}

@Test
public void capitalizeStringLowerCaseTest() {

    String string = "hello world  ";

    string = capitalizeString(string);

    assertThat(string, is("Hello world"));
}

2

การใช้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 ตามที่คุณต้องการและแม้ว่าจะใช้อินสแตนซ์เดียวกัน


2

อีกตัวอย่างหนึ่งวิธีที่คุณสามารถทำให้อักษรตัวแรกของการป้อนข้อมูลของผู้ใช้เป็นตัวพิมพ์ใหญ่

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String string = br.readLine();
// handle supplementary characters
IntStream.concat(
        IntStream.of(string.codePointAt(0))
                .map(Character::toUpperCase), string.codePoints().skip(1)
)
.forEach(cp -> System.out.print(Character.toChars(cp)));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.