Android EditText 使用InputFilter区分中文英文字符长度

有时产品经理提的需求,要区分中文英文字符长度,一个中文字符代表两个英文字符,输入时要区分长度。比如40个中文,就是80个英文字符。这种需求,EditText 的length属性就不能用了。我查了一下,网上已经有人用EditText filter 实现了。特此记录一下(转载自http://blog.csdn.net/satanzw/article/details/41051975):

/**
 * Created by chenglin on 2017-3-21.
 * 自定义的InputFilter ,用来限制英文中文输入字符限制。两个汉字代表一个英文。
 */

public class EnglishCharFilter implements InputFilter {
    int maxLen = 0;

    /**
     * 输入英文的最大长度 。比如你想要限制40个汉字,80个英文字符,传入的值就是80
     * 使用方式:mEdit.setFilters(new InputFilter[]{filter});
     */
    public EnglishCharFilter(int len) {
        maxLen = len;
    }

    public static int calculateLength(CharSequence c, boolean english) {
        double len = 0;
        for (int i = 0; i < c.length(); i++) {
            char cc = c.charAt(i);
            if ((cc & 0xffff) <= 0xff) {
                len += 0.5;
            } else {
                len++;
            }
        }
        if (english) {
            len = len * 2;
        }
        return (int) Math.round(len);
    }

    @Override
    public CharSequence filter(CharSequence src, int start, int end, Spanned dest, int dstart, int dend) {
        int dindex = 0;
        int count = 0;

        while (count <= maxLen && dindex < dest.length()) {
            char c = dest.charAt(dindex++);
            if ((c & 0xffff) <= 0xff) {
                count = count + 1;
            } else {
                count = count + 2;
            }
        }

        if (count > maxLen) {
            return dest.subSequence(0, dindex - 1);
        }

        int sindex = 0;
        while (count <= maxLen && sindex < src.length()) {
            char c = src.charAt(sindex++);
            if ((c & 0xffff) <= 0xff) {
                count = count + 1;
            } else {
                count = count + 2;
            }
        }

        if (count > maxLen) {
            sindex--;
            return src.subSequence(0, sindex);
        }
        return null;
    }

}
===================================

如果你觉得帮到了你,请给作者打赏一口饭吃:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值