Cách viết hoa ký tự đầu tiên của mỗi từ trong chuỗi


421

Có một hàm được xây dựng trong Java viết hoa ký tự đầu tiên của mỗi từ trong Chuỗi và không ảnh hưởng đến các từ khác không?

Ví dụ:

  • jon skeet -> Jon Skeet
  • miles o'Brien-> Miles O'Brien(B vẫn là vốn, quy tắc này ra trường hợp Tiêu đề)
  • old mcdonald-> Old Mcdonald*

* ( Old McDonaldcũng sẽ được tìm thấy, nhưng tôi không hy vọng nó thông minh.)

Một cái nhìn nhanh về Tài liệu chuỗi Java chỉ tiết lộ toUpperCase()toLowerCase(), tất nhiên không cung cấp hành vi mong muốn. Đương nhiên, kết quả của Google bị chi phối bởi hai chức năng đó. Có vẻ như một bánh xe đã được phát minh ra, vì vậy không thể hỏi để tôi có thể sử dụng nó trong tương lai.


18
Thế còn old mcdonald? Điều đó có nên trở thành Old McDonald?
Bart Kiers

2
Tôi không mong đợi chức năng đó là thông minh. (Mặc dù nếu bạn có một cái tôi rất vui khi thấy nó.) Chỉ cần viết chữ cái đầu tiên sau khoảng trắng, nhưng bỏ qua phần còn lại.
WillfulWizard


1
Bạn sẽ không thể tìm thấy một thuật toán xử lý đúng cách viết hoa sau khi thực tế ... miễn là có các cặp tên, một trong số đó có thể đúng cho một người nhất định, như MacDonald và Macdonald, hàm sẽ không có cách nào biết cái nào đúng Tốt hơn là làm những gì bạn đã làm, mặc dù bạn vẫn sẽ nhận được một số tên sai (như von Neumann).
Dave DuPlantis

Hãy dùng thử Burger King ...
Magno C

Câu trả lời:


732

WordUtils.capitalize(str)(từ apache commons-text )

(Lưu ý: nếu bạn cần "fOO BAr"trở thành "Foo Bar", sau đó sử dụng capitalizeFully(..))


5
Tôi nghĩ bạn có nghĩa là WordUtils.capitalize (str). Xem API để biết chi tiết.
Hans Doggen

84
Giữ triết lý của tôi là luôn bỏ phiếu lên các câu trả lời đề cập đến các thư viện commons.
Ravi Wallau

11
Để thay đổi chữ cái đầu tiên thành các từ viết thường, hãy sử dụng capitalizeFully (str).
Umesh Rajbhandari

5
Là giải pháp này thực sự chính xác ? Theo ý kiến ​​của tôi thì không! Nếu bạn muốn viết hoa "LAMborghini", cuối cùng bạn muốn "Lamborghini". Vậy WordUtils.capitalizeFully(str)là giải pháp.
basZero

3
@BasZero đó là câu trả lời đúng cho câu hỏi được hỏi. Tôi sẽ bao gồm phiên bản đầy đủ như một nhận xét.
Bozho

229

Nếu bạn chỉ lo lắng về chữ cái đầu tiên của từ đầu tiên được viết hoa:

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

3
điều này chỉ thay đổi chữ cái đầu tiên của từ đầu tiên
Chrizzz

28
Thật vậy, đây là ý định của tôi.
Nick Bolton

13
@nbolton - Nhưng nó rõ ràng bỏ qua mục đích của câu hỏi, và thất bại cho chính những trường hợp được đưa ra trong ví dụ đó - và nó thêm ít hoặc không có gì vào câu trả lời được đưa ra trước đó!
David Manheim

17
Đoạn mã này không an toàn! Hãy tưởng tượng linelà null hoặc có độ dài <2.
stk

1
Tuy nhiên, hãy trả về Character.toUpperCase (word.charAt (0)) + word.subopes (1) .toLowerCase ()
Exudgeyon 8/2/2016

72

Phương pháp sau đây chuyển đổi tất cả các chữ cái thành chữ hoa / chữ thường, tùy thuộc vào vị trí của chúng gần một khoảng trắng hoặc ký tự đặc biệt khác.

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

Tôi sẽ cải thiện và đơn giản hóa các điều kiện vòng lặp : if(Character.isLetter(chars[i])) { if(!found) { chars[i] = Character.toUpperCase(chars[i]); } found = true; } else { found = false; }.
bancer

@bancer, với ví dụ của bạn, bạn không thể kiểm soát những ký tự nào sẽ không được theo sau bởi một chữ cái viết hoa.
True Soft

@TrueSoft, tôi không hiểu bạn. Tại sao bạn cần kiểm soát những ký tự theo sau chữ in hoa? Theo tôi hiểu, điều quan trọng là ký tự trước sẽ không phải là một chữ cái và ví dụ của tôi đảm bảo điều đó. Chỉ cần thay thế khối if-if-if của bạn bằng khối if-other của tôi và chạy thử nghiệm.
bancer

@TrueSoft, để rõ ràng tôi sẽ đổi tên foundthành previousCharIsLetter.
bancer

9
Tôi thích có câu trả lời không sử dụng thư viện commons, bởi vì thỉnh thoảng bạn không thể sử dụng nó.
Heckman

38

Hãy thử cách rất đơn giản này

ví dụ giveString = "ram is good boy"

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

Đầu ra sẽ là: Ram Is Good Boy


1
mã này khiến máy chủ của chúng tôi gặp sự cố: java.lang.StringIndexOutOfBoundException: Chỉ mục chuỗi nằm ngoài phạm vi: 0
Chrizzz

32
@Chrizzz vì vậy đừng cam kết mã mà bạn đã không kiểm tra ... Nếu bạn cung cấp một chuỗi trống, nó sẽ bị sập. Lỗi của bạn, không phải của Neelam.
Reinherd

1
Nếu có một khoảng trống ở cuối thì nó bị sập thì tôi đã thêm trim () trước tiên và tách chuỗi với dấu cách. Nó hoạt động hoàn hảo
Hanuman

Trong trường hợp ai đó đang tìm kiếm phiên bản Kotlin của nó, thì đây là: stackoverflow.com/a/55390188/1708390
Lỗi xảy ra vào

16

Tôi đã viết một Lớp nhỏ để viết hoa tất cả các từ trong Chuỗi.

Tùy chọn multiple delimiters, mỗi cái có hành vi của nó (viết hoa trước, sau hoặc cả hai, để xử lý các trường hợp nhưO'Brian );

Tùy chọn Locale;

Đừng nghỉ với Surrogate Pairs.

BẢN THỬ TRỰC TIẾP

Đầu ra:

====================================
 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 À

Lưu ý: chữ cái đầu tiên sẽ luôn được viết hoa (chỉnh sửa nguồn nếu bạn không muốn điều đó).

Vui lòng chia sẻ ý kiến ​​của bạn và giúp tôi tìm ra lỗi hoặc để cải thiện mã ...

Mã số:

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
Hmmm, tôi nghĩ rằng dòng thứ hai trong vòng lặp for nên đọc: toBeCapped + = "" + capLetter + tokens [i] .sub chuỗi (1, tokens [i] .length ());
jengelsma

1
Nhưng giải pháp này sẽ thêm một khoảng trắng khi bắt đầu. Vì vậy, bạn có thể cần phải cắt trái.
Kamalakannan J

13

Tôi đã thực hiện một giải pháp trong Java 8 là IMHO dễ đọc hơn.

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

Gist cho giải pháp này có thể được tìm thấy ở đây: https://gist.github.com/Hylke1982/166a792313c5e2df9d31


10

Sử dụng org.apache.commons.lang.StringUtilslàm cho nó rất đơn giản.

capitalizeStr = StringUtils.capitalize(str);

2
@Ash StringUtils.capitalise(str)bị phản đối. Xem: commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/
mẹo

Điều này chỉ viết hoa char đầu tiên của chuỗi chứ không phải char đầu tiên của mỗi từ trong chuỗi. WordUtils chỉ bị phản đối vì nó đã chuyển từ commons lang sang commons văn bản commons.apache.org/proper/commons-text/javadocs/api-release/org/iêu
quangyclic

Không phải là một ý tưởng tốt để sử dụng thư viện bên ngoài cho nhiệm vụ nhỏ.
Stack Overflow

7

Với mã đơn giản này :

String example="hello";

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

System.out.println(example);

Kết quả: xin chào


6
Còn về HELLO thì nó trả về HELLO nhưng dự kiến ​​Xin chào vì vậy bạn sẽ sử dụng toLowerCase () trong SubString thứ hai
Trikaldarshi

5

Tôi đang sử dụng chức năng sau. Tôi nghĩ rằng nó là nhanh hơn trong hiệu suất.

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
Luôn sử dụng StringBuilder khi bạn ghép nối thay vì + =
chitgoks

2
Tại sao bạn nghĩ rằng nó nhanh hơn?
Peter Mortensen

5

Từ Java 9+

bạn có thể sử dụng String::replaceAllnhư thế này:

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

Thí dụ :

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

Đầu ra

Hello This Is Just A Test

4

Sử dụng phương pháp Chia để phân tách chuỗi của bạn thành các từ, sau đó sử dụng các hàm chuỗi tích hợp để viết hoa từng từ, sau đó nối lại với nhau.

Mã giả (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

Cuối chuỗi trông giống như "Câu bạn muốn áp dụng mũ cho"


4

Điều này có thể hữu ích nếu bạn cần viết hoa tiêu đề. Nó viết hoa mỗi chuỗi con được phân tách bằng " ", ngoại trừ các chuỗi được chỉ định như "a"hoặc "the". Tôi chưa chạy nó bởi vì nó muộn, mặc dù vậy sẽ ổn thôi. Sử dụng Apache Commons StringUtils.join()tại một điểm. Bạn có thể thay thế nó bằng một vòng lặp đơn giản nếu bạn muốn.

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
}

Phá vỡ nếu chuỗi có không gian gấp đôi trong đó, đó là đầu vào câm, nhưng FYI.
Chỉ cần thử

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

Chào mừng bạn đến với Stack Overflow! Nói chung, câu trả lời sẽ hữu ích hơn nhiều nếu chúng bao gồm một lời giải thích về những gì mã được dự định làm và tại sao điều đó giải quyết vấn đề mà không giới thiệu người khác.
Neuron

Giải pháp đơn giản nhất cho đến nay và tránh sử dụng libs bên ngoài
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());
}

Đây là câu trả lời đơn giản, cơ bản và tốt nhất cho một người mới như tôi!
abhishah901

3

Tôi quyết định thêm một giải pháp nữa để viết hoa các từ trong chuỗi:

  • các từ được định nghĩa ở đây là các ký tự chữ hoặc chữ số liền kề;
  • cặp thay thế cũng được cung cấp;
  • mã đã được tối ưu hóa cho hiệu suất; và
  • nó vẫn nhỏ gọn

Chức năng:

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

Cuộc gọi ví dụ:

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

Kết quả:

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

3

Sử dụng:

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

Hoạt động hoàn hảo với toLowerCase -> "Matcher matcher = pattern.matcher (text.toLowerCase ());" (Đối với văn bản nhập như "JOHN DOE")
smillien62

3

Có nhiều cách để chuyển đổi chữ cái đầu tiên của từ đầu tiên được viết hoa. Tôi có ý này. Nó rất đơn giản:

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

Cảm ơn bạn đã cố gắng để thêm một câu trả lời. Đây là một ý tưởng hợp lý, nhưng lưu ý rằng đã có các chức năng cơ bản thực hiện điều này và mã thực hiện điều này tương tự với những gì bạn cung cấp và các câu trả lời được chấp nhận đã phác thảo rất rõ ràng tất cả chúng.
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

Đây là một chức năng đơn giản

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
Đừng sử dụng nối chuỗi để tạo chuỗi dài, rất chậm: stackoverflow.com/questions/15177987/
Lukas Knuth

2

Đây chỉ là một cách khác để làm điều đó:

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

Phương pháp tái sử dụng cho 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

Đây là giải pháp của tôi.

Tôi đã chạy qua vấn đề này tối nay và quyết định tìm kiếm nó. Tôi đã tìm thấy câu trả lời của Neelam Singh gần như ở đó, vì vậy tôi quyết định khắc phục sự cố (đứt dây trống) và gây ra sự cố hệ thống.

Phương pháp bạn đang tìm kiếm được đặt tên capString(String s)dưới đây. Nó biến "Chỉ 5 giờ sáng ở đây" thành "Chỉ 5 giờ sáng ở đây".

Các mã được nhận xét khá tốt, vì vậy thưởng thức.

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. Luồng Java 8

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

Ví dụ:

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

Cho foo bARđến Foo Bar, thay thế các map()phương pháp với những điều sau đây:

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

Ví dụ:

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. Văn bản Apache Commons

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

Đối với Titlecase:

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

Để biết chi tiết, hãy xem hướng dẫn này .


1

Đối với những người sử dụng Velocity trong MVC của bạn, bạn có thể sử dụng capitalizeFirstLetter()phương thức từ lớp StringUtils .


1
String s="hi dude i                                 want apple";
    s = s.replaceAll("\\s+"," ");
    String[] split = s.split(" ");
    s="";
    for (int i = 0; i < split.length; i++) {
        split[i]=Character.toUpperCase(split[i].charAt(0))+split[i].substring(1);
        s+=split[i]+" ";
        System.out.println(split[i]);
    }
    System.out.println(s);

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

Nếu bạn thích ổi ...

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

Cách ngắn gọn và chính xác như sau:

String name = "test";

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

Nó hoạt động không có lỗi nếu bạn thử và thay đổi giá trị tên thành ba giá trị. Lỗi miễn phí.


chuyện gì sẽ xảy ra nếu nó nhiều hơn một từ
luckyguy73
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.