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