[java] 문자열에서 각 단어의 첫 문자를 대문자로 표시하는 방법

문자열에있는 각 단어의 첫 문자를 대문자로 바꾸고 다른 단어에는 영향을주지 않는 함수가 Java에 내장되어 있습니까?

예 :

  • jon skeet -> Jon Skeet
  • miles o'Brien-> Miles O'Brien(B는 대문자로 유지되며 제목은 제외됨)
  • old mcdonald-> Old Mcdonald*

* ( Old McDonald나도 찾을 수 있지만, 그것이 똑똑하다고는 생각하지 않습니다.)

상기 얼핏 자바 문자열 문서는 오직 계시 toUpperCase()toLowerCase()물론 원하는 동작을 제공하지 않는. 당연히 Google 결과는이 두 기능에 의해 좌우됩니다. 그것은 이미 발명 된 바퀴처럼 보입니다. 그래서 나중에 사용할 수 있도록 물어 볼 수 없었습니다.



답변

WordUtils.capitalize(str)( 아파치 공통 텍스트에서 )

(참고 : 필요하면 "fOO BAr"되기 위해 "Foo Bar", 다음 사용하는 capitalizeFully(..)대신)


답변

첫 단어의 첫 글자 만 대문자로 표시되는 것이 걱정되는 경우 :

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


답변

다음 방법은 공백이나 다른 특수 문자 근처의 위치에 따라 모든 문자를 대문자 / 소문자로 변환합니다.

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


답변

이 간단한 방법을 사용해보십시오

예 givenString = “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();
}  

다음과 같이 출력됩니다 : Ram Is Good Boy


답변

문자열의 모든 단어를 대문자로하기 위해 작은 클래스를 작성했습니다.

선택 사항 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;
        }
    } 


답변

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


답변

IMHO가 더 읽기 쉬운 Java 8 솔루션을 만들었습니다.

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