TextUtil

在安卓中,我们经常需要对数据进行校验,如身份证、电话号码、姓名等等,
此时可以写一个工具来使用,如下:

public class TextUtil {
	
	 /**
     * 判断姓名
     * */
    public static boolean isName(String name) {

        if (!name.matches("[\u4e00-\u9fa5]{2,4}")) {
            return false;
        }
        return true;
    }
	

    //===============身份证验证====↓↓↓=========
    final static Map<Integer, String> zoneNum = new HashMap<Integer, String>();
    static {
        zoneNum.put(11, "北京");
        zoneNum.put(12, "天津");
        zoneNum.put(13, "河北");
        zoneNum.put(14, "山西");
        zoneNum.put(15, "内蒙古");
        zoneNum.put(21, "辽宁");
        zoneNum.put(22, "吉林");
        zoneNum.put(23, "黑龙江");
        zoneNum.put(31, "上海");
        zoneNum.put(32, "江苏");
        zoneNum.put(33, "浙江");
        zoneNum.put(34, "安徽");
        zoneNum.put(35, "福建");
        zoneNum.put(36, "江西");
        zoneNum.put(37, "山东");
        zoneNum.put(41, "河南");
        zoneNum.put(42, "湖北");
        zoneNum.put(43, "湖南");
        zoneNum.put(44, "广东");
        zoneNum.put(45, "广西");
        zoneNum.put(46, "海南");
        zoneNum.put(50, "重庆");
        zoneNum.put(51, "四川");
        zoneNum.put(52, "贵州");
        zoneNum.put(53, "云南");
        zoneNum.put(54, "西藏");
        zoneNum.put(61, "陕西");
        zoneNum.put(62, "甘肃");
        zoneNum.put(63, "青海");
        zoneNum.put(64, "宁夏");
        zoneNum.put(65, "新疆");
        zoneNum.put(71, "台湾");
        zoneNum.put(81, "香港");
        zoneNum.put(82, "澳门");
        zoneNum.put(91, "外国");
    }

    final static int[] PARITYBIT = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
    final static int[] POWER_LIST = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10,
            5, 8, 4, 2};

    /**
     * =======身份证验证:调用此方法即可
     *
     * @param certNo 号码内容
     * @return 是否有效 null和"" 都是false
     */
    public static boolean isIDCard(String certNo) {
        if (certNo == null || (certNo.length() != 15 && certNo.length() != 18))
            return false;
        final char[] cs = certNo.toUpperCase().toCharArray();
        //校验位数
        int power = 0;
        for (int i = 0; i < cs.length; i++) {
            if (i == cs.length - 1 && cs[i] == 'X')
                break;//最后一位可以 是X或x
            if (cs[i] < '0' || cs[i] > '9')
                return false;
            if (i < cs.length - 1) {
                power += (cs[i] - '0') * POWER_LIST[i];
            }
        }

        //校验区位码
        if (!zoneNum.containsKey(Integer.valueOf(certNo.substring(0, 2)))) {
            return false;
        }

        //校验年份
        String year = null;
        year = certNo.length() == 15 ? getIdcardCalendar(certNo) : certNo.substring(6, 10);


        final int iyear = Integer.parseInt(year);
        if (iyear < 1900 || iyear > Calendar.getInstance().get(Calendar.YEAR))
            return false;//1900年的PASS,超过今年的PASS

        //校验月份
        String month = certNo.length() == 15 ? certNo.substring(8, 10) : certNo.substring(10, 12);
        final int imonth = Integer.parseInt(month);
        if (imonth < 1 || imonth > 12) {
            return false;
        }

        //校验天数
        String day = certNo.length() == 15 ? certNo.substring(10, 12) : certNo.substring(12, 14);
        final int iday = Integer.parseInt(day);
        if (iday < 1 || iday > 31)
            return false;

        //校验"校验码"
        if (certNo.length() == 15)
            return true;
        return cs[cs.length - 1] == PARITYBIT[power % 11];
    }

    private static String getIdcardCalendar(String certNo) {
        // 获取出生年月日
        String birthday = certNo.substring(6, 12);
        SimpleDateFormat ft = new SimpleDateFormat("yyMMdd");
        Date birthdate = null;
        try {
            birthdate = ft.parse(birthday);
        } catch (java.text.ParseException e) {
            e.printStackTrace();
        }
        Calendar cday = Calendar.getInstance();
        cday.setTime(birthdate);
        String year = String.valueOf(cday.get(Calendar.YEAR));
        return year;
    }

    public static void main(String[] args) {
        boolean istrue = isIDCard("330622810725323");
        System.out.println(istrue);
    }
//===============身份证验证====↑↑↑=========



    /**
     * 判断是不是手机号
     * @param str 字符串
     * @return boolean
     *
     * 2019年1月16日已知:
     *
     *    中国电信号段
     *        133,149,153,173,174,177,180,181,189,199
     *    中国联通号段
     *        130,131,132,145,146,155,156,166,175,176,185,186
     *    中国移动号段
     *        134(0-8),135,136,137,138,139,147,148,150,151,152,157,158,159,165,178,182,183,184,187,188,198
     *    上网卡专属号段(用于上网和收发短信,不能打电话)
     *        如中国联通的是145
     *    虚拟运营商
     *        电信:1700,1701,1702
     *        移动:1703,1705,1706
     *        联通:1704,1707,1708,1709,171
     *    卫星通信: 1349     未知号段:141、142、143、144、154
     */
    public static boolean isMobile(String str) {
        Pattern p = null;
        Matcher m = null;
        boolean b = false;
        String s2="^[1](([3|5|8][\\d])|([4][4,5,6,7,8,9])|([6][2,5,6,7])|([7][^9])|([9][1,8,9]))[\\d]{8}$";// 验证手机号
        if(!TextUtils.isEmpty(str)){
            p = Pattern.compile(s2);
            m = p.matcher(str);
            b = m.matches();
        }
        return b;
    }

    /**判断金额格式
     * @param editText
     * @return  返回null说明格式正确,否则返回错误信息
     * PS:此方不做限制长度 和 允许值为0,也没设置只允许输入数字和".";
     * 设置弹出数字键盘:editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER|EditorInfo.TYPE_NUMBER_FLAG_DECIMAL);//设置后值允许输入数字或小数点
     */
    public static String checkMoney(EditText editText){
        String text=editText.getText().toString();

        if (!isNull(text)){

            if (text.contains(".")){
                int index=text.indexOf(".");

                //判断是否两位小数
                if(text.length() > index + 3){
                    return "最多两位小数";
                }

                //小于1时小数点前只能一个0
                if(text.substring(0,1).equals("0")){
                    if (text.substring(0,index).length()>1){
                        return "小于1时小数点前只能一个0";
                    }
                }

            }else {

                //等于0时是否存在多个0
                int value=Integer.valueOf(text);
                if (value == 0 & text.length() > 1){
                    return "多余0";
                }

                //判断是否多余0(例输入的为:0011)
                int length=String.valueOf(Integer.valueOf(text)).length();//转为int类型是会把多余的0去掉
                if (text.length() > length){
                    return "多余0";
                }

            }

        }else {
            return "请输入金额";
        }

        //判断是否为正数或0  防止忘记设置数字键盘而输入其它字符
        String reg = "\\d+(\\.\\d+)?";
        if (!text.matches(reg)){
            return "请输入正数或0";
        }

        return null;
    }

    /**
     * EditText 过滤金额
     * @param editText
     *
     *   !!!ps:输入正确值后,删除.前面的数字会达到以.开头,或以1开头后接着写几个0再把1删掉,达到多个0开头,
     *     该方法不做这个判断,可调用 checkMoney 方法判断。也没限制长度 和 允许值为0
     */
    public static void moneyInputFilter(final EditText editText){

        //==设为数字键盘,只能输入数字或只能输入一个"."
        editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER|EditorInfo.TYPE_NUMBER_FLAG_DECIMAL);
        //或者:editText.setInputType(8194);//等同于android:inputType="numberDecimal",8194就是该属性的id

        //==配置过滤器
        InputFilter filter=new InputFilter() {
            /**
             * @param source    输入文本框的字符,删除字符时source为""
             * @param start     输入或删除都为0
             * @param end       source字符的长度,删除时为0
             * @param dest      原文本框的字符内容
             * @param dstart    输入前 或 删除字符后 光标的位置
             * @param dend      输入前 或 删除前 光标的位置
             * @return
             *
             * ps:return null时,是返回输入的字符而不是空
             */
            @Override
            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                String strSource=source.toString();
                String strDest=dest.toString();

                if (TextUtils.isEmpty(strDest)){
                    //第一个字符不能输入"."
                    if (strSource.equals(".")){
                        return "";
                    }

                }else {
                    //首字为0时,后面只能是"."
                    if (strDest.equals("0") & !strSource.equals(".")){
                        return "";
                    }

                    if (strDest.contains(".")){
                        //文本框已存在"."不可再输入"."
                        if (strSource.contains(".")){
                            return "";
                        }

                        Integer index=strDest.indexOf(".");
                        String value=strDest.substring(0,1);
                        //若首字为0并且第二字符为"."时,只能输入四位数
                        if (value.equals("0") & strDest.length() == 4 & index ==1 ){
                            return "";
                        }

                        //若首字不为0时,"."后面只能存在两位数
                        if (!value.equals("0") & strDest.length()==index+3){
                            if (dend>strDest.indexOf(".")){
                                return "";
                            }
                        }
                    }

                }

                //避免粘贴不符合的格式:例:1.11.2或.11(前面没有数字和有"."了)
                String[] strs=strSource.split("\\.");
                if(strs.length>2){
                    editText.setError("粘贴的金额不正确");
                    return "";
                }else if (strs.length==2){
                    if (strs[0].equals("") & TextUtils.isEmpty(strDest) || strDest.contains(".")){
                        editText.setError("粘贴的金额不正确");
                        return "";
                    }
                }//ps:可禁止粘贴,source>1时就是粘贴了

                return null;
            }
        };

        //==设置过滤器
        editText.setFilters(new InputFilter[]{filter});
        //editText.setFilters(new InputFilter[]{filter,new InputFilter.LengthFilter(9)});
    }


    /**
     * 判断String的值是否为空
     * @param str
     * @return boolean
     */
    public static boolean isNull(String str){
        return str == null || str.trim().equals("") || str.length()==0;
    }

    /**
     * 判断EditText的值是否为空
     * @param editText
     * @return boolean
     */
    public static boolean isNull(EditText editText){
        return isNull(editText.getText().toString());
    }

    /**
     * 判断EditText的值是否为空,若空则设置异常
     * @param editText
     * @return boolean
     */
    public static boolean isNullError(EditText editText){
        if (isNull(editText)){
            editText.setError("必填");
            return true;
        }
        return false;
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值