Come scrivere in maiuscolo il primo carattere di ogni parola in una stringa


421

Esiste una funzione integrata in Java che mette in maiuscolo il primo carattere di ogni parola in una stringa e non influisce sulle altre?

Esempi:

  • jon skeet -> Jon Skeet
  • miles o'Brien-> Miles O'Brien(B rimane capitale, questo esclude il caso del titolo)
  • old mcdonald-> Old Mcdonald*

* ( Old McDonaldsarebbe trovare anche, ma non mi aspetto che sia così intelligente.)

Una rapida occhiata alla documentazione della stringa Java rivela solo toUpperCase()e toLowerCase(), che ovviamente non fornisce il comportamento desiderato. Naturalmente, i risultati di Google sono dominati da queste due funzioni. Sembra una ruota che deve essere stata già inventata, quindi non potrebbe far male chiedere così posso usarla in futuro.


18
Che dire old mcdonald? Dovrebbe diventare Old McDonald?
Bart Kiers,

2
Non mi aspetto che la funzione sia così intelligente. (Anche se se ne hai uno sarei felice di vederlo.) Solo la prima lettera dopo lo spazio bianco, ma ignora il resto.
WillfulWizard,


1
Non saresti in grado di trovare un algoritmo che gestisca correttamente la capitalizzazione dei nomi dopo il fatto ... fintanto che ci sono coppie di nomi, uno dei quali può essere corretto per una determinata persona, come MacDonald e Macdonald, la funzione sarebbe non ho modo di sapere quale fosse corretto. È meglio fare quello che hai fatto, anche se sbaglierai ancora alcuni nomi (come von Neumann).
Dave DuPlantis,

Prova Burger King ...
Magno C

Risposte:


732

WordUtils.capitalize(str)(da apache commons-text )

(Nota: se devi "fOO BAr"diventare "Foo Bar", usa capitalizeFully(..)invece)


5
Penso che intendi WordUtils.capitalize (str). Vedi API per i dettagli.
Hans Doggen,

84
Mantenere la mia filosofia di votare sempre le risposte che si riferiscono alle biblioteche comuni.
Ravi Wallau,

11
Per cambiare la lettera non prima in parole in minuscolo, usa capitalizeFully (str).
Umesh Rajbhandari,

5
Questa soluzione è davvero corretta ? non è secondo me! Se vuoi capitalizzare "LAMborghini", vuoi "Lamborghini" alla fine. Quindi WordUtils.capitalizeFully(str)è la soluzione.
basZero

3
@BasZero è la risposta giusta alla domanda posta. Includerò la versione Completa come commento.
Bozho,

229

Se sei solo preoccupato che la prima lettera della prima parola sia maiuscola:

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

3
questo cambia solo la prima lettera della prima parola
Chrizzz

28
Anzi, questa era la mia intenzione.
Nick Bolton,

13
@nbolton - Ma ignora esplicitamente l'intento della domanda e fallisce proprio per i casi indicati in quell'esempio - e aggiunge poco o niente alle risposte precedentemente fornite!
David Manheim,

17
Questo pezzo di codice non è sicuro per gli incidenti! Immagina di lineessere nullo o di avere una lunghezza <<
apk

1
ancora, restituisce Character.toUpperCase (word.charAt (0)) + word.substring (1) .toLowerCase ()
Eccezione

72

Il seguente metodo converte tutte le lettere in maiuscolo / minuscolo, a seconda della loro posizione vicino a uno spazio o ad altri caratteri speciali.

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

Vorrei migliorare e semplificare le condizioni di loop: if(Character.isLetter(chars[i])) { if(!found) { chars[i] = Character.toUpperCase(chars[i]); } found = true; } else { found = false; }.
bancer

@bancer, con il tuo esempio non puoi controllare quali caratteri non saranno seguiti da una lettera maiuscola.
True Soft,

@TrueSoft, non ti capisco. Perché è necessario controllare quali caratteri seguono dopo la lettera maiuscola? Come ho capito, è importante che il personaggio precedente non sia una lettera e il mio esempio lo assicura. Sostituisci semplicemente il tuo blocco if-else-if con il mio blocco if-else ed esegui un test.
bancer

@TrueSoft, per chiarezza rinominerei found a previousCharIsLetter.
bancer

9
Mi piace avere risposte che non usano la libreria commons, perché ogni tanto non puoi usarla.
Heckman,

39

Prova questo modo molto semplice

esempio datoString = "ram è bravo ragazzo"

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

L'output sarà: Ram Is Good Boy


1
questo codice ha causato l'arresto anomalo del nostro server: java.lang.StringIndexOutOfBoundsException: indice delle stringhe non compreso nell'intervallo: 0
Chrizzz

32
@Chrizzz, quindi non eseguire il commit del codice che non hai testato ... Se si fornisce una stringa vuota, si blocca. Colpa tua, non di Neelam.
Reinherd,

1
Se alla fine c'è uno spazio, allora si sta schiantando, ho aggiunto prima trim () e diviso la stringa con lo spazio. Ha funzionato perfettamente
Hanuman,

Nel caso in cui qualcuno stia cercando la sua versione di Kotlin, eccola qui: stackoverflow.com/a/55390188/1708390
Bugs Happen

16

Ho scritto una piccola classe per scrivere in maiuscolo tutte le parole in una stringa.

Opzionale multiple delimiters, ognuno con il suo comportamento (capitalizzare prima, dopo o entrambi, per gestire casi similiO'Brian );

Opzionale Locale;

Non rompere con Surrogate Pairs.

DIMOSTRAZIONE DAL VIVO

Produzione:

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

Nota: la prima lettera sarà sempre in maiuscolo (modificare la fonte se non lo si desidera).

Per favore condividi i tuoi commenti e aiutami a trovare bug o a migliorare il codice ...

Codice:

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, penso che la seconda riga nel ciclo for dovrebbe essere: toBeCapped + = "" + capLetter + tokens [i] .substring (1, tokens [i] .length ());
jengelsma,

1
Ma questa soluzione aggiungerà uno spazio all'inizio. Quindi potrebbe essere necessario eseguire il trim sinistro.
Kamalakannan J,

13

Ho creato una soluzione in Java 8 che è più leggibile per 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(" "));
}

Il Gist per questa soluzione è disponibile qui: https://gist.github.com/Hylke1982/166a792313c5e2df9d31


10

L'uso lo org.apache.commons.lang.StringUtilsrende molto semplice.

capitalizeStr = StringUtils.capitalize(str);

2
@Ash StringUtils.capitalise(str)è obsoleto. Vedi: commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/…
Navigatron

Questo fa in maiuscolo solo il primo carattere della stringa e non il primo carattere di ogni parola nella stringa. WordUtils è deprecato solo perché è passato dal
linguaggio

Non è una buona idea usare una libreria esterna per piccoli compiti.
Stack Overflow

7

Con questo semplice codice :

String example="hello";

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

System.out.println(example);

Risultato: ciao


6
che dire CIAO restituisce CIAO ma aspettavo ciao, quindi dovrai usare toLowerCase () nella seconda sottostringa
Trikaldarshi,

5

Sto usando la seguente funzione. Penso che sia più veloce nelle prestazioni.

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
Usa sempre StringBuilder quando concateni invece di + =
chitgoks

2
Perché pensi che sia più veloce?
Peter Mortensen,

5

Da Java 9+

puoi usare String::replaceAllcosì:

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

Esempio :

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

Uscite

Hello This Is Just A Test

4

Utilizzare il metodo Split per dividere la stringa in parole, quindi utilizzare le funzioni stringa incorporate per scrivere in maiuscolo ogni parola, quindi aggiungere insieme.

Pseudo-codice (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

Alla fine la stringa appare come "La frase a cui vuoi applicare i tappi"


4

Questo potrebbe essere utile se devi capitalizzare i titoli. Mette in maiuscolo ogni sottostringa delimitata da " ", ad eccezione di stringhe specificate come "a"o "the". Non l'ho ancora eseguito perché è tardi, però dovrebbe andare bene. Usa Apache Commons StringUtils.join()ad un certo punto. Se lo desideri, puoi sostituirlo con un semplice ciclo.

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
}

Si interrompe se la stringa contiene doppi spazi, che è stupido per l'input, ma FYI.
Sto solo provando il

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

Benvenuto in Stack Overflow! In generale, le risposte sono molto più utili se includono una spiegazione di ciò che il codice è destinato a fare e perché risolve il problema senza introdurre altri.
Neurone,

La soluzione più semplice in
assoluto

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

Questa è la risposta più semplice, basilare e migliore per un principiante come me!
abhishah901

3

Ho deciso di aggiungere un'altra soluzione per scrivere in maiuscolo le parole in una stringa:

  • le parole sono definite qui come caratteri adiacenti di lettere o cifre;
  • vengono fornite anche coppie surrogate;
  • il codice è stato ottimizzato per le prestazioni; e
  • è ancora compatto.

Funzione:

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

Esempio di chiamata:

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

Risultato:

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

3

Uso:

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

Funziona perfettamente con toLowerCase -> "Matcher matcher = pattern.matcher (text.toLowerCase ());" (Per il testo di entrata come "JOHN DOE")
smillien62

3

Esistono molti modi per convertire in maiuscolo la prima lettera della prima parola. Ho un'idea. È molto semplice:

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

Grazie per aver provato ad aggiungere una risposta. Questa è un'idea ragionevole, ma nota che ci sono già funzioni di base che lo fanno già, e un codice che lo fa in modo simile a quello che hai fornito, e le risposte accettate già delineano tutte molto chiaramente.
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

Ecco una semplice funzione

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
Non usare la concation per stringhe per creare stringhe lunghe, è dolorosamente lento: stackoverflow.com/questions/15177987/…
Lukas Knuth

2

Questo è solo un altro modo di farlo:

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

Metodo riutilizzabile per 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

Ecco la mia soluzione

Stasera ho riscontrato questo problema e ho deciso di cercarlo. Ho trovato una risposta di Neelam Singh che era quasi lì, quindi ho deciso di risolvere il problema (rotto su stringhe vuote) e causato un arresto anomalo del sistema.

Il metodo che stai cercando è il capString(String s)seguente nome . Trasforma "Sono solo le 5 del mattino qui" in "Sono solo le 5 del mattino qui".

Il codice è abbastanza ben commentato, quindi divertiti.

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

Esempi:

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

Per foo bARper Foo Barsostituire il map()metodo con il seguente:

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

Esempi:

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. Testo di 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

Per titlecase:

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

Per i dettagli, dai un'occhiata a questo tutorial .



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

Se preferisci la Guava ...

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

Il modo breve e preciso è il seguente:

String name = "test";

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

Funziona senza errori se si tenta di modificare il valore del nome in tre di valori. Senza errori.


e se fosse più di una parola
luckyguy73,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.