InputFilter 无法使第一个字符在点字符后保持大写

InputFilter fails to make first character keep uppercase after dots character

无法理解为什么当用户输入 "B.Com".

这样的学士格式时

我想得到 "B.com" - c 字母是小写的。

但我得到:"B.Com" - C 字母大写

这是我的代码:

InputFilter value = new InputFilter() {
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned spanned, int dstart, int dend) {
        for(int i = start; i < end; i++) {
            String letterOne = source.subSequence(0,1).toString().toUpperCase();
            if(Character.toString(source.charAt(i)).matches("[a-zA-Z.? ]*")) {
                return source.subSequence(0,1).toString().toUpperCase()+source.subSequence(1,end).toString().toLowerCase();
            }
            return letterOne+source.subSequence(1,end).toString().toLowerCase();
        }
        return null;
    }
};

您当前在 for 语句中的代码可能会减少

String letterOne = source.subSequence(0,1).toString().toUpperCase();
if(Character.toString(source.charAt(i)).matches("[a-zA-Z.? ]*"))
{
    return source.subSequence(0,1).toString().toUpperCase()+source.subSequence(1,end).toString().toLowerCase();
}
return letterOne+source.subSequence(1,end).toString().toLowerCase();
            

if 语句中你有 source.subSequence(0,1).toString().toUpperCase(),这与 letterOne 完全相同,所以我们可以减少一些代码

String letterOne = source.subSequence(0,1).toString().toUpperCase();
if(Character.toString(source.charAt(i)).matches("[a-zA-Z.? ]*"))
{
    return letterOne+source.subSequence(1,end).toString().toLowerCase();
}
return letterOne+source.subSequence(1,end).toString().toLowerCase();

现在可以清楚地看到 if 语句包含与方法中最后一个 return 相同的 return,因此它可能会再次缩减为:

String letterOne = source.subSequence(0,1).toString().toUpperCase();
return letterOne + source.subSequence(1,end).toString().toLowerCase();

在上面的代码中你根本没有使用 i,所以整个 for 语句是无用的并且 filter 可能被缩短为:

@Override
public CharSequence filter(CharSequence source, int start, int end,
        Spanned spanned, int dstart, int dend) {
    if (start <= end) return null;
    String letterOne = source.subSequence(0,1).toString().toUpperCase();
    return letterOne + source.subSequence(1,end).toString().toLowerCase();
}

没有 .-present 检查代码,除第一个字母外没有任何其他字母大写...您总是返回与 source 相同的 String,首字母大写且所有字母都大写其他小写

您可以尝试使用 indexOf method for checking if dot is present in whole String sourceAsString (convert from CharSequence source), if yes then use split 方法来制作包含两个 String 的数组 - 将两个单词的首字母大写并加入它们 String properlyFormatted = firstWord + "." + secondWord;

PS。请注意 split 方法将 REGEX 作为参数,而 "." 在 REGEX 中表示“任何字母”,因此请像这样使用转义:split("\.")