วิธีใช้อักษรตัวแรกของแต่ละคำให้เป็นตัวพิมพ์ใหญ่ในสตริง


421

มีฟังก์ชั่นที่สร้างขึ้นใน Java ที่ใช้อักษรตัวแรกของแต่ละคำในสตริงและไม่ส่งผลกระทบต่ออักขระอื่นหรือไม่?

ตัวอย่าง:

  • jon skeet -> Jon Skeet
  • miles o'Brien-> Miles O'Brien(B ยังคงเป็นทุนกฎนี้ออกกรณีชื่อ)
  • old mcdonald-> Old Mcdonald*

* ( Old McDonaldจะหาเหมือนกัน แต่ฉันไม่คิดว่ามันจะฉลาดขนาดนั้น)

ดูอย่างรวดเร็วที่Java String Documentationเปิดเผยเท่านั้นtoUpperCase()และtoLowerCase()แน่นอนว่าไม่ได้มีพฤติกรรมที่ต้องการ โดยปกติแล้วผลลัพธ์ของ Google นั้นถูกครอบงำด้วยฟังก์ชันทั้งสอง ดูเหมือนว่าล้อที่จะต้องมีการประดิษฐ์ขึ้นแล้วมันไม่เจ็บที่จะถามดังนั้นฉันสามารถใช้มันได้ในอนาคต


18
เกี่ยวกับold mcdonaldอะไร นั่นควรจะเป็นOld McDonaldอย่างไร
บาร์ต Kiers

2
ฉันไม่คาดหวังว่าฟังก์ชั่นนี้จะฉลาดขนาดนั้น (แม้ว่าคุณจะมีสักอันฉันก็ยินดีที่จะเห็นมัน) เพียงแค่อักษรตัวแรกขึ้นหลังช่องว่างสีขาว แต่ไม่สนใจที่เหลือ
WillfulWizard


1
คุณจะไม่สามารถหาอัลกอริทึมที่จัดการกับการใช้อักษรตัวพิมพ์ใหญ่ชื่อได้อย่างถูกต้องหลังจากข้อเท็จจริงแล้ว ... ตราบใดที่ยังมีชื่อคู่ซึ่งอาจจะถูกต้องสำหรับคนที่ให้มาเช่น MacDonald และ Macdonald ฟังก์ชั่นจะ ไม่มีทางที่จะรู้ว่าอะไรถูกต้อง ดีกว่าที่จะทำสิ่งที่คุณทำแม้ว่าคุณจะยังคงชื่อผิด (เช่น von Neumann)
Dave DuPlantis

ลอง Burger King ...
Magno C

คำตอบ:


732

WordUtils.capitalize(str)(จากapache คอมมอนส์ - ข้อความ )

(หมายเหตุ: หากคุณต้องการ"fOO BAr"ที่จะกลายเป็น"Foo Bar"แล้วใช้capitalizeFully(..)แทน)


5
ฉันคิดว่าคุณหมายถึง WordUtils.capitalize (str) ดู API สำหรับรายละเอียด
Hans Doggen

84
รักษาปรัชญาของฉันในการโหวตคำตอบที่อ้างอิงถึงห้องสมุดทั่วไป
Ravi Wallau

11
หากต้องการเปลี่ยนตัวอักษรที่ไม่ใช่ตัวแรกเป็นคำที่เป็นตัวพิมพ์เล็กให้ใช้ตัวพิมพ์ใหญ่ (str)
Umesh Rajbhandari

5
วิธีนี้ถูกต้องจริงเหรอ? มันไม่ได้อยู่ในความคิดของฉัน! หากคุณต้องการใช้ตัวพิมพ์ใหญ่ "LAMborghini" คุณต้องการ "Lamborghini" ในที่สุด ดังนั้นWordUtils.capitalizeFully(str)ทางออกคือ
basZero

3
@BasZero มันเป็นคำตอบที่ถูกต้องสำหรับคำถามที่ถาม ฉันจะรวมเวอร์ชันเต็มเป็นความคิดเห็น
Bozho

229

หากคุณกังวลเฉพาะตัวอักษรตัวแรกของคำแรกที่เป็นตัวพิมพ์ใหญ่:

private String capitalize(final String line) {
   return Character.toUpperCase(line.charAt(0)) + line.substring(1);
}

3
สิ่งนี้จะเปลี่ยนแปลงตัวอักษรตัวแรกของคำแรกเท่านั้น
Chrizzz

28
อันที่จริงนี่คือความตั้งใจของฉัน
Nick Bolton

13
@nbolton - แต่มันไม่สนใจเจตนาของคำถามอย่างชัดเจนและล้มเหลวในกรณีที่ให้ไว้ในตัวอย่าง - และจะเพิ่มคำตอบเล็กน้อยหรือไม่มีอะไรให้ก่อนหน้านี้!
David Manheim

17
รหัสชิ้นนี้ไม่ปลอดภัย - ผิดพลาด! ลองนึกภาพว่าlineเป็นโมฆะหรือมีความยาว <2
stk

1
ยังคงส่งคืน Character.toUpperCase (word.charAt (0)) + word.substring (1) .toLowerCase ()
ยกเว้น

72

วิธีการต่อไปนี้แปลงตัวอักษรทั้งหมดเป็นตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กทั้งนี้ขึ้นอยู่กับตำแหน่งของพวกเขาใกล้กับช่องว่างหรือตัวอักษรพิเศษอื่น ๆ

public static String capitalizeString(String string) {
  char[] chars = string.toLowerCase().toCharArray();
  boolean found = false;
  for (int i = 0; i < chars.length; i++) {
    if (!found && Character.isLetter(chars[i])) {
      chars[i] = Character.toUpperCase(chars[i]);
      found = true;
    } else if (Character.isWhitespace(chars[i]) || chars[i]=='.' || chars[i]=='\'') { // You can add other chars here
      found = false;
    }
  }
  return String.valueOf(chars);
}

if(Character.isLetter(chars[i])) { if(!found) { chars[i] = Character.toUpperCase(chars[i]); } found = true; } else { found = false; }ฉันจะปรับปรุงและลดความซับซ้อนของสภาพห่วง:
bancer

@bancer ด้วยตัวอย่างของคุณคุณไม่สามารถควบคุมได้ว่าอักขระตัวไหนจะไม่ตามด้วยตัวอักษรตัวพิมพ์ใหญ่
True Soft

@ TrueSoft ฉันไม่เข้าใจคุณ ทำไมคุณต้องควบคุมตัวละครที่ตามหลังตัวอักษรตัวใหญ่? ตามที่ฉันเข้าใจเป็นสิ่งสำคัญที่อักขระก่อนหน้านั้นจะไม่เป็นตัวอักษรและตัวอย่างของฉันรับรองได้ว่า เพียงแค่แทนที่ if-else-if block ของคุณด้วย if-else block ของฉันและทำการทดสอบ
bancer

@TrueSoft เพื่อความชัดเจนผมจะเปลี่ยนชื่อไปfound previousCharIsLetter
bancer

9
ฉันชอบคำตอบที่ไม่ได้ใช้ห้องสมุดสาธารณะเพราะทุกครั้งที่คุณไม่สามารถใช้งานได้
Heckman

38

ลองวิธีนี้ง่าย ๆ

ตัวอย่าง GivenString = "ram เป็นเด็กดี"

public static String toTitleCase(String givenString) {
    String[] arr = givenString.split(" ");
    StringBuffer sb = new StringBuffer();

    for (int i = 0; i < arr.length; i++) {
        sb.append(Character.toUpperCase(arr[i].charAt(0)))
            .append(arr[i].substring(1)).append(" ");
    }          
    return sb.toString().trim();
}  

ผลลัพธ์จะเป็น: Ram Is Good Boy


1
รหัสนี้ทำให้เซิร์ฟเวอร์ของเราพัง: java.lang.StringIndexOutOfBoundsException: ดัชนีสตริงอยู่นอกช่วง: 0
Chrizzz

32
@Chrizzz ดังนั้นอย่าส่งรหัสที่คุณไม่ได้ทดสอบ ... หากคุณระบุสตริงว่างมันจะล้มเหลว ความผิดของคุณไม่ใช่ของ Neelam
เพิ่ม

1
หากมีช่องว่างในตอนท้ายมันก็พังแล้วฉันก็เพิ่มเล็ม () ก่อนและแยกสตริงด้วยช่องว่างมันทำงานได้อย่างสมบูรณ์
Hanuman

ในกรณีที่มีใครบางคนกำลังมองหารุ่น Kotlin ของที่นี่ก็คือ: stackoverflow.com/a/55390188/1708390
Bugs เกิดขึ้น

16

ฉันได้เขียนคลาสเล็ก ๆ เพื่อใช้ประโยชน์จากคำทั้งหมดในสตริง

เป็นตัวเลือกmultiple delimitersแต่ละรายการที่มีพฤติกรรม (ใช้ประโยชน์ก่อนหรือหลังหรือทั้งสองกรณีเพื่อจัดการกรณีเช่นนี้O'Brian);

เลือกได้Locale;

Surrogate Pairsอย่าแบ่งด้วย

สาธิตสด

เอาท์พุท:

====================================
 SIMPLE USAGE
====================================
Source: cApItAlIzE this string after WHITE SPACES
Output: Capitalize This String After White Spaces

====================================
 SINGLE CUSTOM-DELIMITER USAGE
====================================
Source: capitalize this string ONLY before'and''after'''APEX
Output: Capitalize this string only beforE'AnD''AfteR'''Apex

====================================
 MULTIPLE CUSTOM-DELIMITER USAGE
====================================
Source: capitalize this string AFTER SPACES, BEFORE'APEX, and #AFTER AND BEFORE# NUMBER SIGN (#)
Output: Capitalize This String After Spaces, BeforE'apex, And #After And BeforE# Number Sign (#)

====================================
 SIMPLE USAGE WITH CUSTOM LOCALE
====================================
Source: Uniforming the first and last vowels (different kind of 'i's) of the Turkish word D[İ]YARBAK[I]R (DİYARBAKIR) 
Output: Uniforming The First And Last Vowels (different Kind Of 'i's) Of The Turkish Word D[i]yarbak[i]r (diyarbakir) 

====================================
 SIMPLE USAGE WITH A SURROGATE PAIR 
====================================
Source: ab 𐐂c de à
Output: Ab 𐐪c De À

หมายเหตุ: ตัวอักษรตัวแรกจะเป็นตัวพิมพ์ใหญ่เสมอ (แก้ไขแหล่งที่มาหากคุณไม่ต้องการ)

กรุณาแบ่งปันความคิดเห็นของคุณและช่วยฉันในการพบข้อบกพร่องหรือเพื่อปรับปรุงรหัส ...

รหัส:

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

public class WordsCapitalizer {

    public static String capitalizeEveryWord(String source) {
        return capitalizeEveryWord(source,null,null);
    }

    public static String capitalizeEveryWord(String source, Locale locale) {
        return capitalizeEveryWord(source,null,locale);
    }

    public static String capitalizeEveryWord(String source, List<Delimiter> delimiters, Locale locale) {
        char[] chars; 

        if (delimiters == null || delimiters.size() == 0)
            delimiters = getDefaultDelimiters();                

        // If Locale specified, i18n toLowerCase is executed, to handle specific behaviors (eg. Turkish dotted and dotless 'i')
        if (locale!=null)
            chars = source.toLowerCase(locale).toCharArray();
        else 
            chars = source.toLowerCase().toCharArray();

        // First charachter ALWAYS capitalized, if it is a Letter.
        if (chars.length>0 && Character.isLetter(chars[0]) && !isSurrogate(chars[0])){
            chars[0] = Character.toUpperCase(chars[0]);
        }

        for (int i = 0; i < chars.length; i++) {
            if (!isSurrogate(chars[i]) && !Character.isLetter(chars[i])) {
                // Current char is not a Letter; gonna check if it is a delimitrer.
                for (Delimiter delimiter : delimiters){
                    if (delimiter.getDelimiter()==chars[i]){
                        // Delimiter found, applying rules...                       
                        if (delimiter.capitalizeBefore() && i>0 
                            && Character.isLetter(chars[i-1]) && !isSurrogate(chars[i-1]))
                        {   // previous character is a Letter and I have to capitalize it
                            chars[i-1] = Character.toUpperCase(chars[i-1]);
                        }
                        if (delimiter.capitalizeAfter() && i<chars.length-1 
                            && Character.isLetter(chars[i+1]) && !isSurrogate(chars[i+1]))
                        {   // next character is a Letter and I have to capitalize it
                            chars[i+1] = Character.toUpperCase(chars[i+1]);
                        }
                        break;
                    }
                } 
            }
        }
        return String.valueOf(chars);
    }


    private static boolean isSurrogate(char chr){
        // Check if the current character is part of an UTF-16 Surrogate Pair.  
        // Note: not validating the pair, just used to bypass (any found part of) it.
        return (Character.isHighSurrogate(chr) || Character.isLowSurrogate(chr));
    }       

    private static List<Delimiter> getDefaultDelimiters(){
        // If no delimiter specified, "Capitalize after space" rule is set by default. 
        List<Delimiter> delimiters = new ArrayList<Delimiter>();
        delimiters.add(new Delimiter(Behavior.CAPITALIZE_AFTER_MARKER, ' '));
        return delimiters;
    } 

    public static class Delimiter {
        private Behavior behavior;
        private char delimiter;

        public Delimiter(Behavior behavior, char delimiter) {
            super();
            this.behavior = behavior;
            this.delimiter = delimiter;
        }

        public boolean capitalizeBefore(){
            return (behavior.equals(Behavior.CAPITALIZE_BEFORE_MARKER)
                    || behavior.equals(Behavior.CAPITALIZE_BEFORE_AND_AFTER_MARKER));
        }

        public boolean capitalizeAfter(){
            return (behavior.equals(Behavior.CAPITALIZE_AFTER_MARKER)
                    || behavior.equals(Behavior.CAPITALIZE_BEFORE_AND_AFTER_MARKER));
        }

        public char getDelimiter() {
            return delimiter;
        }
    }

    public static enum Behavior {
        CAPITALIZE_AFTER_MARKER(0),
        CAPITALIZE_BEFORE_MARKER(1),
        CAPITALIZE_BEFORE_AND_AFTER_MARKER(2);                      

        private int value;          

        private Behavior(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }           
    } 

15
String toBeCapped = "i want this sentence capitalized";

String[] tokens = toBeCapped.split("\\s");
toBeCapped = "";

for(int i = 0; i < tokens.length; i++){
    char capLetter = Character.toUpperCase(tokens[i].charAt(0));
    toBeCapped +=  " " + capLetter + tokens[i].substring(1);
}
toBeCapped = toBeCapped.trim();

1
อืมฉันคิดว่าบรรทัดที่สองใน for for loop ควรอ่าน: toBeCapped + = "" + capLetter + โทเค็น [i] .substring (1, โทเค็น [i] .length ());
jengelsma

1
แต่วิธีนี้จะเพิ่มช่องว่างที่จุดเริ่มต้น ดังนั้นคุณอาจต้องตัดแต่งด้านซ้าย
Kamalakannan J

13

ฉันสร้างโซลูชันใน Java 8 ที่สามารถอ่านได้มากขึ้นของ IMHO

public String firstLetterCapitalWithSingleSpace(final String words) {
    return Stream.of(words.trim().split("\\s"))
    .filter(word -> word.length() > 0)
    .map(word -> word.substring(0, 1).toUpperCase() + word.substring(1))
    .collect(Collectors.joining(" "));
}

สรุปสาระสำคัญสำหรับการแก้ปัญหานี้สามารถพบได้ที่นี่: https://gist.github.com/Hylke1982/166a792313c5e2df9d31


10

การใช้org.apache.commons.lang.StringUtilsทำให้มันง่ายมาก

capitalizeStr = StringUtils.capitalize(str);

2
@Ash StringUtils.capitalise(str)เลิกใช้แล้ว ดู: commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/…
Navigatron

สิ่งนี้จะใช้อักขระตัวแรกของสตริงไม่ใช่ตัวอักษรตัวแรกของแต่ละคำในสตริง WordUtils เลิกใช้เนื่องจากย้ายจากคอมมอนส์ไปยังคอมมอนข้อความcommons.apache.org/proper/commons-text/javadocs/api-release/org/…
opticyclic

ไม่ใช่ความคิดที่ดีที่จะใช้ไลบรารีภายนอกสำหรับงานเล็ก ๆ น้อย ๆ
Stack Overflow

7

ด้วยรหัสง่ายๆนี้ :

String example="hello";

example=example.substring(0,1).toUpperCase()+example.substring(1, example.length());

System.out.println(example);

ผลลัพธ์:สวัสดี


6
แล้ว HELLO จะได้ผลตอบแทนเป็น HELLO แต่คาดว่า Hello ดังนั้นคุณจะต้องใช้ toLowerCase () ใน SubString ที่สอง
Trikaldarshi

5

ฉันใช้ฟังก์ชั่นต่อไปนี้ ฉันคิดว่ามันเร็วกว่าในการแสดง

public static String capitalize(String text){
    String c = (text != null)? text.trim() : "";
    String[] words = c.split(" ");
    String result = "";
    for(String w : words){
        result += (w.length() > 1? w.substring(0, 1).toUpperCase(Locale.US) + w.substring(1, w.length()).toLowerCase(Locale.US) : w) + " ";
    }
    return result.trim();
}

3
ใช้ StringBuilder เสมอเมื่อคุณเชื่อมต่อกันมากกว่า + =
chitgoks

2
ทำไมคุณคิดว่ามันเร็วกว่า
Peter Mortensen

5

จาก Java 9+

คุณสามารถใช้String::replaceAllสิ่งนี้:

public static void upperCaseAllFirstCharacter(String text) {
    String regex = "\\b(.)(.*?)\\b";
    String result = Pattern.compile(regex).matcher(text).replaceAll(
            matche -> matche.group(1).toUpperCase() + matche.group(2)
    );

    System.out.println(result);
}

ตัวอย่าง:

upperCaseAllFirstCharacter("hello this is Just a test");

เอาท์พุท

Hello This Is Just A Test

4

ใช้วิธีการแยกเพื่อแยกสตริงของคุณเป็นคำจากนั้นใช้ฟังก์ชันสตริงในตัวเพื่อใช้ประโยชน์จากคำแต่ละคำให้เป็นประโยชน์จากนั้นจึงผนวกเข้าด้วยกัน

รหัสหลอก (ish)

string = "the sentence you want to apply caps to";
words = string.split(" ") 
string = ""
for(String w: words)

//This line is an easy way to capitalize a word
    word = word.toUpperCase().replace(word.substring(1), word.substring(1).toLowerCase())

    string += word

ในสตริงสุดท้ายดูเหมือนว่า "ประโยคที่คุณต้องการใช้ตัวพิมพ์ใหญ่กับ"


4

สิ่งนี้อาจมีประโยชน์หากคุณต้องการใช้ตัวพิมพ์ใหญ่ มัน capitalizes แต่ละย่อยคั่นด้วย" "ยกเว้นสำหรับสตริงที่ระบุเช่นหรือ"a" "the"ฉันยังไม่ได้วิ่งเลยเพราะมันสายไปแล้ว ใช้ Apache Commons StringUtils.join()ณ จุดหนึ่ง คุณสามารถแทนที่ด้วยการวนซ้ำแบบง่าย ๆ ถ้าคุณต้องการ

private static String capitalize(String string) {
    if (string == null) return null;
    String[] wordArray = string.split(" "); // Split string to analyze word by word.
    int i = 0;
lowercase:
    for (String word : wordArray) {
        if (word != wordArray[0]) { // First word always in capital
            String [] lowercaseWords = {"a", "an", "as", "and", "although", "at", "because", "but", "by", "for", "in", "nor", "of", "on", "or", "so", "the", "to", "up", "yet"};
            for (String word2 : lowercaseWords) {
                if (word.equals(word2)) {
                    wordArray[i] = word;
                    i++;
                    continue lowercase;
                }
            }
        }
        char[] characterArray = word.toCharArray();
        characterArray[0] = Character.toTitleCase(characterArray[0]);
        wordArray[i] = new String(characterArray);
        i++;
    }
    return StringUtils.join(wordArray, " "); // Re-join string
}

แตกถ้าสตริงมีช่องว่างสองครั้งในนั้นซึ่งเป็นใบ้สำหรับการป้อนข้อมูล แต่ FYI
JustTrying

4
public static String toTitleCase(String word){
    return Character.toUpperCase(word.charAt(0)) + word.substring(1);
}

public static void main(String[] args){
    String phrase = "this is to be title cased";
    String[] splitPhrase = phrase.split(" ");
    String result = "";

    for(String word: splitPhrase){
        result += toTitleCase(word) + " ";
    }
    System.out.println(result.trim());
}

ยินดีต้อนรับสู่ Stack Overflow! โดยทั่วไปแล้วคำตอบมีประโยชน์มากขึ้นหากพวกเขามีคำอธิบายว่ารหัสนี้มีจุดประสงค์เพื่ออะไรและเหตุใดจึงแก้ปัญหาได้โดยไม่ต้องแนะนำผู้อื่น
Neuron

ทางออกที่ง่ายที่สุดโดยหลีกเลี่ยงการใช้ libs ภายนอก
Billyjoker

3
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   

System.out.println("Enter the sentence : ");

try
{
    String str = br.readLine();
    char[] str1 = new char[str.length()];

    for(int i=0; i<str.length(); i++)
    {
        str1[i] = Character.toLowerCase(str.charAt(i));
    }

    str1[0] = Character.toUpperCase(str1[0]);
    for(int i=0;i<str.length();i++)
    {
        if(str1[i] == ' ')
        {                   
            str1[i+1] =  Character.toUpperCase(str1[i+1]);
        }
        System.out.print(str1[i]);
    }
}
catch(Exception e)
{
    System.err.println("Error: " + e.getMessage());
}

นี่คือคำตอบที่ง่ายที่สุดพื้นฐานและดีที่สุดสำหรับมือใหม่อย่างฉัน!
abhishah901

3

ฉันตัดสินใจเพิ่มโซลูชันอีกหนึ่งคำสำหรับการใช้อักษรตัวพิมพ์ใหญ่ในสตริง:

  • คำถูกกำหนดที่นี่เป็นตัวอักษรหรือตัวเลขที่อยู่ติดกัน;
  • คู่ตัวแทนมีให้เช่นกัน
  • รหัสได้รับการปรับให้เหมาะสมสำหรับประสิทธิภาพ และ
  • มันยังคงมีขนาดกะทัดรัด

ฟังก์ชั่น:

public static String capitalize(String string) {
  final int sl = string.length();
  final StringBuilder sb = new StringBuilder(sl);
  boolean lod = false;
  for(int s = 0; s < sl; s++) {
    final int cp = string.codePointAt(s);
    sb.appendCodePoint(lod ? Character.toLowerCase(cp) : Character.toUpperCase(cp));
    lod = Character.isLetterOrDigit(cp);
    if(!Character.isBmpCodePoint(cp)) s++;
  }
  return sb.toString();
}

ตัวอย่างการโทร:

System.out.println(capitalize("An à la carte StRiNg. Surrogate pairs: 𐐪𐐪."));

ผลลัพธ์:

An À La Carte String. Surrogate Pairs: 𐐂𐐪.

3

ใช้:

    String text = "jon skeet, miles o'brien, old mcdonald";

    Pattern pattern = Pattern.compile("\\b([a-z])([\\w]*)");
    Matcher matcher = pattern.matcher(text);
    StringBuffer buffer = new StringBuffer();
    while (matcher.find()) {
        matcher.appendReplacement(buffer, matcher.group(1).toUpperCase() + matcher.group(2));
    }
    String capitalized = matcher.appendTail(buffer).toString();
    System.out.println(capitalized);

ทำงานได้อย่างสมบูรณ์กับ toLowerCase -> "Matcher matcher = pattern.matcher (text.toLowerCase ());" (สำหรับข้อความที่ป้อนเช่น "JOHN DOE")
smillien62

3

มีหลายวิธีในการแปลงอักษรตัวแรกของคำแรกที่เป็นตัวพิมพ์ใหญ่ ฉันมีความคิด. มันง่ายมาก:

public String capitalize(String str){

     /* The first thing we do is remove whitespace from string */
     String c = str.replaceAll("\\s+", " ");
     String s = c.trim();
     String l = "";

     for(int i = 0; i < s.length(); i++){
          if(i == 0){                              /* Uppercase the first letter in strings */
              l += s.toUpperCase().charAt(i);
              i++;                                 /* To i = i + 1 because we don't need to add               
                                                    value i = 0 into string l */
          }

          l += s.charAt(i);

          if(s.charAt(i) == 32){                   /* If we meet whitespace (32 in ASCII Code is whitespace) */
              l += s.toUpperCase().charAt(i+1);    /* Uppercase the letter after whitespace */
              i++;                                 /* Yo i = i + 1 because we don't need to add
                                                   value whitespace into string l */
          }        
     }
     return l;
}

ขอบคุณที่พยายามเพิ่มคำตอบ นี่เป็นความคิดที่สมเหตุสมผล แต่โปรดทราบว่ามีฟังก์ชั่นพื้นฐานที่ทำสิ่งนี้อยู่แล้วและโค้ดที่ทำสิ่งนี้คล้ายกับสิ่งที่คุณให้ไว้และคำตอบที่ได้รับการยอมรับแล้วร่างทั้งหมดไว้อย่างชัดเจน
David Manheim

2
  package com.test;

 /**
   * @author Prasanth Pillai
   * @date 01-Feb-2012
   * @description : Below is the test class details
   * 
   * inputs a String from a user. Expect the String to contain spaces and    alphanumeric     characters only.
   * capitalizes all first letters of the words in the given String.
   * preserves all other characters (including spaces) in the String.
   * displays the result to the user.
   * 
   * Approach : I have followed a simple approach. However there are many string    utilities available 
   * for the same purpose. Example : WordUtils.capitalize(str) (from apache commons-lang)
   *
   */
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStreamReader;

  public class Test {

public static void main(String[] args) throws IOException{
    System.out.println("Input String :\n");
    InputStreamReader converter = new InputStreamReader(System.in);
    BufferedReader in = new BufferedReader(converter);
    String inputString = in.readLine();
    int length = inputString.length();
    StringBuffer newStr = new StringBuffer(0);
    int i = 0;
    int k = 0;
    /* This is a simple approach
     * step 1: scan through the input string
     * step 2: capitalize the first letter of each word in string
     * The integer k, is used as a value to determine whether the 
     * letter is the first letter in each word in the string.
     */

    while( i < length){
        if (Character.isLetter(inputString.charAt(i))){
            if ( k == 0){
            newStr = newStr.append(Character.toUpperCase(inputString.charAt(i)));
            k = 2;
            }//this else loop is to avoid repeatation of the first letter in output string 
            else {
            newStr = newStr.append(inputString.charAt(i));
            }
        } // for the letters which are not first letter, simply append to the output string. 
        else {
            newStr = newStr.append(inputString.charAt(i));
            k=0;
        }
        i+=1;           
    }
    System.out.println("new String ->"+newStr);
    }
}

2

นี่คือฟังก์ชั่นที่เรียบง่าย

public static String capEachWord(String source){
    String result = "";
    String[] splitString = source.split(" ");
    for(String target : splitString){
        result += Character.toUpperCase(target.charAt(0))
                + target.substring(1) + " ";
    }
    return result.trim();
}

1
อย่าใช้การเรียงสตริงเพื่อสร้างสตริงยาวมันช้าลงอย่างเจ็บปวด: stackoverflow.com/questions/15177987//
Lukas Knuth

2

นี่เป็นอีกวิธีหนึ่งในการทำ:

private String capitalize(String line)
{
    StringTokenizer token =new StringTokenizer(line);
    String CapLine="";
    while(token.hasMoreTokens())
    {
        String tok = token.nextToken().toString();
        CapLine += Character.toUpperCase(tok.charAt(0))+ tok.substring(1)+" ";        
    }
    return CapLine.substring(0,CapLine.length()-1);
}

2

วิธีนำมาใช้ใหม่สำหรับ intiCap:

    public class YarlagaddaSireeshTest{

    public static void main(String[] args) {
        String FinalStringIs = "";
        String testNames = "sireesh yarlagadda test";
        String[] name = testNames.split("\\s");

        for(String nameIs :name){
            FinalStringIs += getIntiCapString(nameIs) + ",";
        }
        System.out.println("Final Result "+ FinalStringIs);
    }

    public static String getIntiCapString(String param) {
        if(param != null && param.length()>0){          
            char[] charArray = param.toCharArray(); 
            charArray[0] = Character.toUpperCase(charArray[0]); 
            return new String(charArray); 
        }
        else {
            return "";
        }
    }
}

2

นี่คือทางออกของฉัน

ฉันวิ่งข้ามปัญหานี้คืนนี้และตัดสินใจที่จะค้นหา ฉันพบคำตอบของ Neelam Singh ที่เกือบจะอยู่ที่นั่นดังนั้นฉันตัดสินใจที่จะแก้ไขปัญหา (แยกสตริงว่าง) และทำให้ระบบล่ม

วิธีการที่คุณค้นหานั้นมีชื่ออยู่capString(String s)ด้านล่าง มันเปลี่ยน "มันแค่ 5 โมงที่นี่" เป็น "มันแค่ 5 โมงที่นี่"

รหัสมีความเห็นค่อนข้างดีดังนั้นสนุก

package com.lincolnwdaniel.interactivestory.model;

    public class StringS {

    /**
     * @param s is a string of any length, ideally only one word
     * @return a capitalized string.
     * only the first letter of the string is made to uppercase
     */
    public static String capSingleWord(String s) {
        if(s.isEmpty() || s.length()<2) {
            return Character.toUpperCase(s.charAt(0))+"";
        } 
        else {
            return Character.toUpperCase(s.charAt(0)) + s.substring(1);
        }
    }

    /**
     *
     * @param s is a string of any length
     * @return a title cased string.
     * All first letter of each word is made to uppercase
     */
    public static String capString(String s) {
        // Check if the string is empty, if it is, return it immediately
        if(s.isEmpty()){
            return s;
        }

        // Split string on space and create array of words
        String[] arr = s.split(" ");
        // Create a string buffer to hold the new capitalized string
        StringBuffer sb = new StringBuffer();

        // Check if the array is empty (would be caused by the passage of s as an empty string [i.g "" or " "],
        // If it is, return the original string immediately
        if( arr.length < 1 ){
            return s;
        }

        for (int i = 0; i < arr.length; i++) {
            sb.append(Character.toUpperCase(arr[i].charAt(0)))
                    .append(arr[i].substring(1)).append(" ");
        }
        return sb.toString().trim();
    }
}

2

1. Java 8 Streams

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

    return Arrays.stream(str.split("\\s+"))
            .map(t -> t.substring(0, 1).toUpperCase() + t.substring(1))
            .collect(Collectors.joining(" "));
}

ตัวอย่าง:

System.out.println(capitalizeAll("jon skeet")); // Jon Skeet
System.out.println(capitalizeAll("miles o'Brien")); // Miles O'Brien
System.out.println(capitalizeAll("old mcdonald")); // Old Mcdonald
System.out.println(capitalizeAll(null)); // null

สำหรับfoo bARถึงFoo Bar, ให้เปลี่ยนmap()เมธอดดังต่อไปนี้:

.map(t -> t.substring(0, 1).toUpperCase() + t.substring(1).toLowerCase())

2. String.replaceAll()(Java 9+)

ublic static String capitalizeAll(String str) {
    if (str == null || str.isEmpty()) {
        return str;
    }

    return Pattern.compile("\\b(.)(.*?)\\b")
            .matcher(str)
            .replaceAll(match -> match.group(1).toUpperCase() + match.group(2));
}

ตัวอย่าง:

System.out.println(capitalizeAll("12 ways to learn java")); // 12 Ways To Learn Java
System.out.println(capitalizeAll("i am atta")); // I Am Atta
System.out.println(capitalizeAll(null)); // null

3. Apache Commons Text

System.out.println(WordUtils.capitalize("love is everywhere")); // Love Is Everywhere
System.out.println(WordUtils.capitalize("sky, sky, blue sky!")); // Sky, Sky, Blue Sky!
System.out.println(WordUtils.capitalize(null)); // null

สำหรับหัวเรื่อง:

System.out.println(WordUtils.capitalizeFully("fOO bAR")); // Foo Bar
System.out.println(WordUtils.capitalizeFully("sKy is BLUE!")); // Sky Is Blue!

สำหรับรายละเอียดชำระเงินบทช่วยสอนนี้


1

สำหรับบรรดาของคุณโดยใช้ความเร็วใน MVC ของคุณคุณสามารถใช้capitalizeFirstLetter()วิธีการจากชั้น StringUtils



1
package corejava.string.intern;

import java.io.DataInputStream;

import java.util.ArrayList;

/*
 * wap to accept only 3 sentences and convert first character of each word into upper case
 */

public class Accept3Lines_FirstCharUppercase {

    static String line;
    static String words[];
    static ArrayList<String> list=new ArrayList<String>();

    /**
     * @param args
     */
    public static void main(String[] args) throws java.lang.Exception{

        DataInputStream read=new DataInputStream(System.in);
        System.out.println("Enter only three sentences");
        int i=0;
        while((line=read.readLine())!=null){
            method(line);       //main logic of the code
            if((i++)==2){
                break;
            }
        }
        display();
        System.out.println("\n End of the program");

    }

    /*
     * this will display all the elements in an array
     */
    public static void display(){
        for(String display:list){
            System.out.println(display);
        }
    }

    /*
     * this divide the line of string into words 
     * and first char of the each word is converted to upper case
     * and to an array list
     */
    public static void method(String lineParam){
        words=line.split("\\s");
        for(String s:words){
            String result=s.substring(0,1).toUpperCase()+s.substring(1);
            list.add(result);
        }
    }

}

1

ถ้าคุณชอบฝรั่ง ...

String myString = ...;

String capWords = Joiner.on(' ').join(Iterables.transform(Splitter.on(' ').omitEmptyStrings().split(myString), new Function<String, String>() {
    public String apply(String input) {
        return Character.toUpperCase(input.charAt(0)) + input.substring(1);
    }
}));

1
String toUpperCaseFirstLetterOnly(String str) {
    String[] words = str.split(" ");
    StringBuilder ret = new StringBuilder();
    for(int i = 0; i < words.length; i++) {
        ret.append(Character.toUpperCase(words[i].charAt(0)));
        ret.append(words[i].substring(1));
        if(i < words.length - 1) {
            ret.append(' ');
        }
    }
    return ret.toString();
}

1

วิธีที่สั้นและแม่นยำมีดังนี้:

String name = "test";

name = (name.length() != 0) ?name.toString().toLowerCase().substring(0,1).toUpperCase().concat(name.substring(1)): name;
--------------------
Output
--------------------
Test
T 
empty
--------------------

มันทำงานได้โดยไม่มีข้อผิดพลาดถ้าคุณลองและเปลี่ยนค่าชื่อเป็นสามค่า ปราศจากข้อผิดพลาด


เกิดอะไรขึ้นถ้ามันมีมากกว่าหนึ่งคำ
luckyguy73
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.