Як правильно використовувати велику літеру слова в рядку за допомогою 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 (наприклад, цифри, розділові знаки, літери з діакритикою, не латинські символи).
Саймон Нікерсон

1

Відповіді:


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 ();
Девід Броссар

2
І ви хочете перевірити довжину рядка, бо це може бути 1 буквенна рядок, а то й 0.
Марек

1
Я знайшов це тут для створення імені getter та setter, тому до 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
Приємно. Я "однолінійний" це: return original.length() == 0 ? original : original.substring(0, 1).toUpperCase() + original.substring(1);
mharper

2
@mharper: if length() == 0чи не можемо ми сміливо сказати, що це, ""і повернути це замість original? Заощаджує нам кілька символів в одній лайнері. Я запитую, тому що я відчуваю, що Java - мова, така повна гатчі, я, чесно кажучи, не здивуюсь, якби був якийсь інший спосіб мати рядок довжиною нульовою.
ArtOfWarfare

Ви говорите всю правду @ArtOfWarfare.
mharper

Примітка: можливо, ви також хочете, щоб це працювало з не англійськими літерами. У цьому випадку слід вказати локаль у методі toUpperCase ().
Макалеле

Використовувати String.toUpperCase(Locale)для довільного рядка неможливо , тому що локальний код повинен відповідати тексту. Так, його слід використовувати, але не завжди зрозуміло, який Localeвикористовувати ...
Крістофер Шульц

81

Найпростіший спосіб - використовувати org.apache.commons.lang.StringUtilsклас

StringUtils.capitalize(Str);


8
Тут невелика сторона. Він працює лише для рядків, які вже не використовуються з великої літери.
роботодавець

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

Це не відповідає на питання про ОП. Оскільки це змінює регістр інших букв.
Lieuwe Rooijakkers

Подивіться на питання. Напевно, ви не добре зрозуміли це питання.
Самет Ö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
Це буде прописувати першу букву кожного слова, а не рядка в цілому. Дивіться приклади, надані ОП. Також можуть виникнути проблеми, якщо в кінці рядка є пробіл.
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-у. :-)
Саймон Нікерсон

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

Мій функціональний підхід. перший заголовок символів у реченні після пробілів у цілому абзаці.

Для активізації лише першого символу слова просто видаліть .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

Навіть для «простого» коду я би використовував бібліотеки. Справа не в коді сам по собі, а в вже існуючих тестових випадках, що стосуються виняткових випадків. Це можуть бути 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

Враховуючи inputрядок:

Character.toUpperCase(input.charAt(0)) + input.substring(1).toLowerCase()

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Клас від Commons Lang надає 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);
    }
 }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.