web-dev-qa-db-ja.com

Androidで文字列をタイトルケースに変換するにはどうすればよいですか?

私は高低を検索しましたが、このタイプの質問への間接的な参照しか見つかりませんでした。 Androidアプリケーションを開発するときに、ユーザーが入力した文字列がある場合、どのようにタイトルケースに変換できますか(つまり、各Wordの最初の文字を大文字にします)?ライブラリ全体(ApacheのWordUtilsなど)をインポートしたくありません。

22
Russ

これをテキストユーティリティクラスに配置します。

public static String toTitleCase(String str) {

    if (str == null) {
        return null;
    }

    boolean space = true;
    StringBuilder builder = new StringBuilder(str);
    final int len = builder.length();

    for (int i = 0; i < len; ++i) {
        char c = builder.charAt(i);
        if (space) {
            if (!Character.isWhitespace(c)) {
                // Convert to title case and switch out of whitespace mode.
                builder.setCharAt(i, Character.toTitleCase(c));
                space = false;
            }
        } else if (Character.isWhitespace(c)) {
            space = true;
        } else {
            builder.setCharAt(i, Character.toLowerCase(c));
        }
    }

    return builder.toString();
}
32
Codeversed

私はここからいくつかのポインタを得ました: Android、ListViewで各Wordの最初の文字を大文字にする必要があります ですが、最後に、独自のソリューションをロールしました(注、このアプローチはすべての単語が分離されていると想定しています)単一のスペース文字で、これは私のニーズには問題ありませんでした):

String[] words = input.getText().toString().split(" ");
StringBuilder sb = new StringBuilder();
if (words[0].length() > 0) {
    sb.append(Character.toUpperCase(words[0].charAt(0)) + words[0].subSequence(1, words[0].length()).toString().toLowerCase());
    for (int i = 1; i < words.length; i++) {
        sb.append(" ");
        sb.append(Character.toUpperCase(words[i].charAt(0)) + words[i].subSequence(1, words[i].length()).toString().toLowerCase());
    }
}
String titleCaseValue = sb.toString();

...ここで、入力はEditTextビューです。とにかくデフォルトでタイトルケースになるようにビューの入力タイプを設定することも役に立ちます:

input.setInputType(InputType.TYPE_TEXT_FLAG_CAP_WORDS);
16
Russ

これはあなたを助けます

EditText view = (EditText) find..
String txt = view.getText();
txt = String.valueOf(txt.charAt(0)).toUpperCase() + txt.substring(1, txt.length());
13

Apacheの WordUtils.capitalize() method を探しています。

13
SLaks

XMLでは、次のように実行できます。

Android:inputType="textCapWords"

文の大文字小文字、すべて大文字など、他のオプションの参照をここで確認します。

http://developer.Android.com/reference/Android/widget/TextView.html#attr_Android:inputType

8
zeeshan

クラス全体をインポートしたくない場合のWordUtils.capitalize()メソッドを次に示します。

public static String capitalize(String str) {
    return capitalize(str, null);
}

public static String capitalize(String str, char[] delimiters) {
    int delimLen = (delimiters == null ? -1 : delimiters.length);
    if (str == null || str.length() == 0 || delimLen == 0) {
        return str;
    }
    int strLen = str.length();
    StringBuffer buffer = new StringBuffer(strLen);
    boolean capitalizeNext = true;
    for (int i = 0; i < strLen; i++) {
        char ch = str.charAt(i);

        if (isDelimiter(ch, delimiters)) {
            buffer.append(ch);
            capitalizeNext = true;
        } else if (capitalizeNext) {
            buffer.append(Character.toTitleCase(ch));
            capitalizeNext = false;
        } else {
            buffer.append(ch);
        }
    }
    return buffer.toString();
}
private static boolean isDelimiter(char ch, char[] delimiters) {
    if (delimiters == null) {
        return Character.isWhitespace(ch);
    }
    for (int i = 0, isize = delimiters.length; i < isize; i++) {
        if (ch == delimiters[i]) {
            return true;
        }
    }
    return false;
}

それが役に立てば幸い。

6
SafaOrhan

次のようなことをしてください:

public static String toCamelCase(String s){
    if(s.length() == 0){
        return s;
    }
    String[] parts = s.split(" ");
    String camelCaseString = "";
    for (String part : parts){
        camelCaseString = camelCaseString + toProperCase(part) + " ";
    }
    return camelCaseString;
}

public static String toProperCase(String s) {
    return s.substring(0, 1).toUpperCase() +
            s.substring(1).toLowerCase();
}
3
mossman252

私は同じ問題を抱えていて、これで解決しました:

import Android.text.TextUtils;
...

String[] words = input.split("[.\\s]+");

for(int i = 0; i < words.length; i++) {
    words[i] = words[i].substring(0,1).toUpperCase()
               + words[i].substring(1).toLowerCase();
}

String titleCase = TextUtils.join(" ", words);

私の場合、ピリオドも削除する必要があったことに注意してください。スペースで置き換える必要がある文字は、「分割」時に角括弧の間に挿入できます。たとえば、次のコードは最終的にアンダースコア、ピリオド、カンマ、または空白を置き換えます。

String[] words = input.split("[_.,\\s]+");

もちろん、これは "非Word文字"記号 を使用することで、はるかに簡単に実現できます。

String[] words = input.split("\\W+");

数字とハイフン[〜#〜]は[〜#〜]が「Word文字」と見なされるため、この最後のバージョンは私のニーズを完全に満たし、うまくいけば、そこにいる誰かを助けるでしょう。

2
gMale

複数の文字列と単一の文字列の両方で機能する以下の解決策を確認してください

 String toBeCapped = "i want this sentence capitalized";  
 String[] tokens = toBeCapped.split("\\s"); 

 if(tokens.length>0)
 {
   toBeCapped = ""; 

    for(int i = 0; i < tokens.length; i++)
    { 
     char capLetter = Character.toUpperCase(tokens[i].charAt(0)); 
     toBeCapped += " " + capLetter + tokens[i].substring(1, tokens[i].length()); 
    }
 }
 else
 {
  char capLetter = Character.toUpperCase(toBeCapped.charAt(0)); 
  toBeCapped += " " + capLetter + toBeCapped .substring(1, toBeCapped .length()); 
 }
0

この関数を使用して、キャメルケースのデータを変換します

 public static String camelCase(String stringToConvert) {
        if (TextUtils.isEmpty(stringToConvert))
            {return "";}
        return Character.toUpperCase(stringToConvert.charAt(0)) +
                stringToConvert.substring(1).toLowerCase();
    }
0
Rajesh Tiwari

文字列配列の最初の単語を残りの単語と区別する必要がないように、@ Russから受け入れられた回答を簡略化しました。 (私はすべての単語の後にスペースを追加し、次に文を返す前に文をトリミングします)

public static String toCamelCaseSentence(String s) {

    if (s != null) {
        String[] words = s.split(" ");

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < words.length; i++) {
            sb.append(toCamelCaseWord(words[i]));
        }

        return sb.toString().trim();
    } else {
        return "";
    }
}

空の文字列(文中の複数のスペース)と文字列内の1文字の単語を処理します。

public static String toCamelCaseWord(String Word) {
    if (Word ==null){
        return "";
    }

    switch (Word.length()) {
        case 0:
            return "";
        case 1:
            return Word.toUpperCase(Locale.getDefault()) + " ";
        default:
            char firstLetter = Character.toUpperCase(Word.charAt(0));
            return firstLetter + Word.substring(1).toLowerCase(Locale.getDefault()) + " ";
    }
}
0
Angel Koh

Kotlin-Android-Title Case/Camel Case function

fun toTitleCase(str: String?): String? {

        if (str == null) {
            return null
        }

        var space = true
        val builder = StringBuilder(str)
        val len = builder.length

        for (i in 0 until len) {
            val c = builder[i]
            if (space) {
                if (!Character.isWhitespace(c)) {
                    // Convert to title case and switch out of whitespace mode.
                    builder.setCharAt(i, Character.toTitleCase(c))
                    space = false
                }
            } else if (Character.isWhitespace(c)) {
                space = true
            } else {
                builder.setCharAt(i, Character.toLowerCase(c))
            }
        }

        return builder.toString()
    }

[〜#〜]または[〜#〜]

fun camelCase(stringToConvert: String): String {
    if (TextUtils.isEmpty(stringToConvert)) {
        return "";
    }
    return Character.toUpperCase(stringToConvert[0]) +
            stringToConvert.substring(1).toLowerCase();
}
0
ramana vv

ApacheのWordUtils.capitalize()メソッドに基づいてコードを書きました。区切り文字を正規表現文字列として設定できます。 「of」などの単語をスキップする場合は、区切り文字として設定します。

public static String capitalize(String str, final String delimitersRegex) {
    if (str == null || str.length() == 0) {
        return "";
    }

    final Pattern delimPattern;
    if (delimitersRegex == null || delimitersRegex.length() == 0){
        delimPattern = Pattern.compile("\\W");
    }else {
        delimPattern = Pattern.compile(delimitersRegex);
    }

    final Matcher delimMatcher = delimPattern.matcher(str);
    boolean delimiterFound = delimMatcher.find();

    int delimeterStart = -1;
    if (delimiterFound){
        delimeterStart = delimMatcher.start();
    }

    final int strLen = str.length();
    final StringBuilder buffer = new StringBuilder(strLen);

    boolean capitalizeNext = true;
    for (int i = 0; i < strLen; i++) {
        if (delimiterFound && i == delimeterStart) {
            final int endIndex = delimMatcher.end();

            buffer.append( str.substring(i, endIndex) );
            i = endIndex;

            if( (delimiterFound = delimMatcher.find()) ){
                delimeterStart = delimMatcher.start();
            }

            capitalizeNext = true;
        } else {
            final char ch = str.charAt(i);

            if (capitalizeNext) {
                buffer.append(Character.toTitleCase(ch));
                capitalizeNext = false;
            } else {
                buffer.append(ch);
            }
        }
    }
    return buffer.toString();
}

それが役に立てば幸い:)

0
ErickBergmann