最近两天运营说录入电话号码老是报格式不正确错误,但是电话明明是正常的,我跑去他那里仔细看了看所有的参数都是正常:
找了很久都没有找到原因,参数明明没有问题。细问是怎么操作的,说是从Excel中复制过来的,于是便怀疑在复制的时候复制了多余的东西。于是试了手写是正常,mac电脑复制过来是正常,windows有些版本的Excel复制过来就有问题。本地一调试发现,果不其然,正常手写的手机号是11位,但是复制过来的确是多了一个东西,长度变为了12位,多了个'\u202D',问题找到了。
搜了一下,网上也有好多同学遇到过这个问题,于是写了个工具类,去掉其中的多余字符,问题就解决了:
package com.lianj.crm.modules.sys.utils;
import com.lianj.crm.common.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.regex.Pattern;
/**
* 电话工具类
*
* @author xiaowei
* @date 2019年8月21日
*/
public class PhoneUtils {
private static Logger logger = LoggerFactory.getLogger(PhoneUtils.class);
/**
* 电话校验,先处理特殊字符后校验
* @param str
* @return
*/
public static boolean checkPhone(String str) {
if (StringUtils.isNotBlank(str)) {
dealPhoneNumber(str);// 先进行特殊字符处理
String expression = "^[1][3,4,5,6,7,8,9][0-9]{9}$";
Pattern pattern = Pattern.compile(expression);
return pattern.matcher(str).matches();
}
return false;
}
/**
* 处理电话特殊字符问题
*
* @param phone
* @return
*/
public static String dealPhoneNumber(String phone) {
if (StringUtils.isNotBlank(phone)) {
phone = removeNonAscii(phone);
phone = removeSomeControlChar(phone);
phone = removeFullControlChar(phone).trim();
return digitFileter(phone);
}
return null;
}
/**
* 数字过滤
*
* @param str
* @return
*/
public static String digitFileter(String str) {
if (StringUtils.isNotBlank(str)) {
char[] num = str.trim().toCharArray();
char[] arr = new char[num.length];
int j = 0;
for (int i = 0; i < num.length; i++) {
if (Character.isDigit(num[i])) {
arr[j] = num[i];
j++;
}
}
return String.valueOf(arr).trim();
}
return null;
}
/**
* 去除非ascii码字符
*
* @param str
* @return
*/
public static String removeNonAscii(String str) {
return str.replaceAll("[^\\x00-\\x7F]", "");
}
/**
* 去除不可打印字符
*
* @param str
* @return
*/
public static String removeNonPrintable(String str) {
return str.replaceAll("[\\p{C}]", "");
}
/**
* 去除一些控制字符 Control Char
*
* @param str
* @return
*/
public static String removeSomeControlChar(String str) {
return str.replaceAll("[\\p{Cntrl}\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}]", ""); // Some Control Char
}
/**
* 去除一些换行制表符
*
* @param str
* @return
*/
public static String removeFullControlChar(String str) {
return removeNonPrintable(str).replaceAll("[\\r\\n\\t]", "");
}
public static void main(String[] args) {
String phone = "198345688882";
System.out.println(checkPhone(phone));
}
}
总结:
'\u202D'应该是属于不可打印字符,因此不能正常显示出来,但是确实占了字符串位数,所以导致错误。mark一下,希望能帮到遇到同样错误的同学。