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

Ответы:


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
Я нашел это здесь для создания имени получателя и установщика, поэтому в 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.
Четверг

Примечание: вы также можете сделать так, чтобы это работало с неанглийскими буквами. В этом случае вы должны указать локаль в методе toUpperCase ().
Макаделе

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

81

Самый простой способ - использовать org.apache.commons.lang.StringUtilsкласс

StringUtils.capitalize(Str);


8
Небольшое примечание здесь. Он работает только для строк, которые еще не написаны заглавными буквами.
Jobbert

5
@jobbert Пожалуйста, уточните свой комментарий. Если строки уже написаны заглавными буквами, будут ли они некапитализированы, несмотря на то, что метод назван capitalize?
Cœur



6
String sentence = "ToDAY   WeAthEr   GREat";    
public static String upperCaseWords(String sentence) {
        String words[] = sentence.replaceAll("\\s+", " ").trim().split(" ");
        String newSentence = "";
        for (String word : words) {
            for (int i = 0; i < word.length(); i++)
                newSentence = newSentence + ((i == 0) ? word.substring(i, i + 1).toUpperCase(): 
                    (i != word.length() - 1) ? word.substring(i, i + 1).toLowerCase() : word.substring(i, i + 1).toLowerCase().toLowerCase() + " ");
        }

        return newSentence;
    }
//Today Weather Great

Это не отвечает на вопрос ОП. Так как это меняет регистр других букв.
Lieuwe Rooijakkers

Посмотри на вопрос. Возможно, вы плохо поняли вопрос.
Самет ОЗТОПРАК

3
String s=t.getText().trim();
int l=s.length();
char c=Character.toUpperCase(s.charAt(0));
s=c+s.substring(1);
for(int i=1; i<l; i++)
    {
        if(s.charAt(i)==' ')
        {
            c=Character.toUpperCase(s.charAt(i+1));
            s=s.substring(0, i) + c + s.substring(i+2);
        }
    }
    t.setText(s);

2
Это будет прописная буква первой буквы каждого слова, а не строки в целом. Смотрите примеры, предоставленные OP. Также могут возникнуть проблемы, если в конце строки есть пробел.
tobias_k

2

Вот, пожалуйста (надеюсь, это даст вам идею):

/*************************************************************************
 *  Compilation:  javac Capitalize.java
 *  Execution:    java Capitalize < input.txt
 * 
 *  Read in a sequence of words from standard input and capitalize each
 *  one (make first letter uppercase; make rest lowercase).
 *
 *  % java Capitalize
 *  now is the time for all good 
 *  Now Is The Time For All Good 
 *  to be or not to be that is the question
 *  To Be Or Not To Be That Is The Question 
 *
 *  Remark: replace sequence of whitespace with a single space.
 *
 *************************************************************************/

public class Capitalize {

    public static String capitalize(String s) {
        if (s.length() == 0) return s;
        return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
    }

    public static void main(String[] args) {
        while (!StdIn.isEmpty()) {
            String line = StdIn.readLine();
            String[] words = line.split("\\s");
            for (String s : words) {
                StdOut.print(capitalize(s) + " ");
            }
            StdOut.println();
        }
    }

}

и не меняйте регистр других букв. Также ваше использование StdInи StdOutне очень Java-у. :-)
Саймон Никерсон

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 Text . Получите его через 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()в этом случае. Это лучший вариант для объединения только двух строк (хотя не так хорошо для многих строк). В этом случае код будет выглядеть так:

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()метода String

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.