วิธีการใช้อักษรตัวพิมพ์ใหญ่ของคำแรกในสตริงโดยใช้ Java


223

ตัวอย่างสตริง

one thousand only
two hundred
twenty
seven

ฉันจะเปลี่ยนอักขระตัวแรกของสตริงเป็นตัวพิมพ์ใหญ่ได้อย่างไรและไม่เปลี่ยนแปลงตัวอักษรอื่น ๆ

หลังจากการเปลี่ยนแปลงมันควรจะเป็น:

One thousand only
Two hundred
Twenty
Seven

หมายเหตุ: ฉันไม่ต้องการใช้ apache.commons.lang.WordUtils เพื่อทำสิ่งนี้


1
@eat_a_lemon: ดีกว่าการใช้ Character.toUpperCase () เป็นอย่างดีเนื่องจากเกี่ยวข้องกับกรณีอื่นที่ไม่ใช่ az (เช่นตัวเลขเครื่องหมายวรรคตอนตัวอักษรที่มีเครื่องหมายกำกับออกเสียงอักขระที่ไม่ใช่ละติน)
Simon Nickerson

1
เกี่ยวข้อง: stackoverflow.com/questions/1149855
ManBugra

คำตอบ:


544

หากคุณต้องการใช้ตัวอักษรตัวแรกของสตริงที่เป็นตัวพิมพ์ใหญ่inputและปล่อยให้ส่วนที่เหลืออยู่คนเดียว:

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

ตอนนี้outputจะมีสิ่งที่คุณต้องการ ตรวจสอบว่าinputตัวละครของคุณมีความยาวอย่างน้อยหนึ่งตัวก่อนใช้งานมิฉะนั้นคุณจะได้รับข้อยกเว้น


37
นอกจากนี้ฉันจะนำอินพุตทั้งหมดและทำให้เป็นตัวพิมพ์เล็กหรือนำตัวอย่างของคุณกลับมาใช้ใหม่ดังต่อไปนี้: String output = input.substring (0, 1) .toUpperCase () + input.substring (1) .toLowerCase ();
David Brossard

2
และคุณต้องการตรวจสอบความยาวของสตริงเนื่องจากอาจเป็น 1 ตัวอักษรสตริงหรือแม้แต่ 0
Marek

1
ฉันพบสิ่งนี้ที่นี่เพื่อสร้าง getter และ setter name ดังนั้น LowerCase ในส่วนที่เหลือของ String จะทำให้การตั้งชื่อฟิลด์แตก คำตอบที่ได้รับนั้นสมบูรณ์แบบสำหรับฉัน
ไก

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

เพียง ... โซลูชั่นที่สมบูรณ์ฉันเห็นว่ามันเป็นเพียงแค่การรวมสิ่งที่คนอื่น ๆ จบลงด้วยการโพสต์ = P


12
ดี ฉัน "หนึ่ง linered" มัน: return original.length() == 0 ? original : original.substring(0, 1).toUpperCase() + original.substring(1);
mharper

2
@harper: if length() == 0เราไม่สามารถพูดได้อย่างปลอดภัยว่ามัน""และคืนนั้นแทนoriginal? ช่วยเราสองสามตัวในหนึ่งซับ ฉันถามเพราะฉันรู้สึกว่า Java เป็นภาษาที่เต็มไปด้วย gotcha ฉันจะไม่แปลกใจเลยหากมีวิธีอื่นที่จะมีสตริงของความยาวเป็นศูนย์
ArtOfWarfare

คุณพูดความจริงทั้งหมด @ArtOfWarfare
mharper

หมายเหตุ: คุณอาจต้องการทำให้การทำงานกับตัวอักษรที่ไม่ใช่ภาษาอังกฤษ ในกรณีนั้นคุณควรระบุ locale ใน toUpperCase () วิธีการ
Makalele

มันเป็นไปไม่ได้ที่จะใช้String.toUpperCase(Locale)สำหรับสตริงโดยพลการเพราะสถานที่จะต้องตรงกับข้อความ ใช่มันควรจะใช้ แต่ก็ไม่ชัดเจนว่าLocaleจะใช้ ...
Christopher Schultz

81

วิธีที่ง่ายที่สุดคือใช้org.apache.commons.lang.StringUtilsคลาส

StringUtils.capitalize(Str);


8
ข้อสังเกตเล็กน้อยที่นี่ มันใช้งานได้เฉพาะสำหรับสตริงที่ไม่ได้เป็นตัวพิมพ์ใหญ่แล้ว
jobbert

5
@jobbert โปรดอธิบายความคิดเห็นของคุณ หากสตริงนั้นเป็นตัวพิมพ์ใหญ่แล้วมันจะไม่ตัดส่วนที่ไม่ได้เป็นวิธีการที่ตั้งชื่อcapitalizeหรือไม่?
Cœur



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

สิ่งนี้ไม่ตอบคำถามของ OP เนื่องจากมันเปลี่ยนตัวอักษรของตัวอักษรอื่น
Lieuwe Rooijakkers

ดูคำถาม อาจเป็นไปได้ว่าคุณไม่ได้รับคำถามที่ดี
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
นี่จะเป็นตัวพิมพ์ใหญ่ของอักษรตัวแรกของแต่ละคำไม่ใช่ตัวอักษรโดยรวม ดูตัวอย่างจาก OP นอกจากนี้ยังอาจมีปัญหาหากมีช่องว่างในตอนท้ายของสตริง
tobias_k

2

ไปเลย (หวังว่านี่จะให้ความคิดแก่คุณ)

/*************************************************************************
 *  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();
        }
    }

}

และไม่เปลี่ยนแปลงตัวพิมพ์ของตัวอักษรอื่น นอกจากนี้การใช้งานของคุณStdInและStdOutไม่มาก Java-y :-)
Simon Nickerson

2

มันง่ายเพียงหนึ่งบรรทัดรหัสเป็นสิ่งจำเป็นสำหรับเรื่องนี้ ถ้าเป็นเช่นString A = scanner.nextLine(); นั้นคุณจะต้องเขียนสิ่งนี้เพื่อแสดงสตริงด้วยอักษรตัวแรกที่เป็นตัวพิมพ์ใหญ่

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

และมันทำตอนนี้


1

ตัวอย่างการใช้คลาส 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

โซลูชันด้วย StringBuilder:

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

.. ตามคำตอบก่อนหน้า


1

การเพิ่มทุกอย่างเข้าด้วยกันเป็นความคิดที่ดีที่จะตัดแต่งเพื่อเพิ่มพื้นที่สีขาวที่จุดเริ่มต้นของสตริง มิฉะนั้น. substring (0,1) .toUpperCase จะพยายามพิมพ์ใหญ่ช่องว่าง

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

1

วิธีการทำงานของฉัน ตัวละครของมัน capstilise ตัวแรกในประโยคหลังจาก whitescape ในวรรคทั้งหมด

สำหรับการเพิ่มตัวอักษรตัวแรกของคำเพียงแค่ลบ. split ("")

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

1

อัปเดตกรกฎาคม 2019

ปัจจุบันฟังก์ชั่นห้องสมุดที่ทันสมัยที่สุดสำหรับการทำเช่นนี้มีอยู่ใน org.apache.commons.lang3.StringUtils

import org.apache.commons.lang3.StringUtils;

StringUtils.capitalize(myString);

หากคุณใช้ Maven ให้นำเข้าการพึ่งพาใน pom.xml ของคุณ:

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

1

แม้แต่รหัส "ง่าย ๆ " ฉันก็ใช้ห้องสมุด สิ่งนี้ไม่ได้เป็นรหัสต่อ se แต่กรณีทดสอบที่มีอยู่แล้วครอบคลุมกรณีพิเศษ นี่อาจเป็นnullสตริงว่างสตริงในภาษาอื่น ๆ

ส่วนการจัดการคำถูกย้ายออกจาก Apache Commons Lang มันถูกวางไว้ในขณะนี้ในApache Commons ข้อความ ได้รับมันผ่านhttps://search.maven.org/artifact/org.apache.commons/commons-text

คุณสามารถใช้WordUtils.capitalize (String str)จาก Apache Commons Text มันมีพลังมากกว่าที่คุณต้องการ นอกจากนี้ยังสามารถใช้ประโยชน์ได้อย่างเต็มที่ (เช่นการแก้ไข"oNe tousand only")

เนื่องจากมันทำงานกับข้อความที่สมบูรณ์เราจึงต้องบอกให้ใช้อักษรตัวพิมพ์ใหญ่เฉพาะคำแรก

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

คลาส JUnit เต็มรูปแบบเพื่อเปิดใช้งานการเล่นด้วยฟังก์ชันการทำงาน:

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

หากคุณต้องการใช้อักษรตัวพิมพ์ใหญ่เพียงตัวเดียวคุณสามารถใช้รหัสด้านล่างได้

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

1

ที่จริงแล้วคุณจะได้รับประสิทธิภาพที่ดีที่สุดหากคุณหลีกเลี่ยง+การใช้งานและใช้งานconcat()ในกรณีนี้ มันเป็นตัวเลือกที่ดีที่สุดสำหรับการรวม 2 สาย (ไม่ดีสำหรับหลาย ๆ สาย) ในกรณีนั้นรหัสจะเป็นดังนี้:

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

0

ใช้สิ่งนี้:

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

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

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

ฉันต้องการเพิ่มการตรวจสอบค่า NULL และ IndexOutOfBoundsException ในคำตอบที่ยอมรับ

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

รหัส 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;
        }
    }

เอาท์พุท:

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

ต่อไปนี้จะให้ผลลัพธ์ที่สอดคล้องกันโดยไม่คำนึงถึงมูลค่าของ inputString ของคุณ:

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

0

1. ใช้substring()วิธีการของสตริง

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

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

ตอนนี้เรียกcapitalize()เมธอดเพื่อแปลงอักษรตัวแรกของสตริงให้เป็นตัวพิมพ์ใหญ่:

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

2. Apache Commons Lang

StringUtilsระดับจากคอมมอนส์แลงมีcapitalize()วิธีการที่ยังสามารถนำมาใช้เพื่อวัตถุประสงค์นี้:

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ไฟล์ของคุณ(สำหรับ Maven เท่านั้น):

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

นี่คือบทความที่อธิบายรายละเอียดสองแนวทางนี้


-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);
    }
 }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.