场景:系统存在客户可以通过上传excel来输入一些产品数据。对应用户输入数据校验是进行精确校验。所以输入的数据需要首尾去空格,因为空格肉眼无法判断是否存在,但是对应数据进行精确匹配时候回匹配上。
处理办法:处理首尾空格不是有手就行吗?
那个String自带的trim()去重。自测通过,代码直接上去生产。
but 事情并不像我想的那么单纯。
首先是大前提,保证产品的准确性下,去除首尾空格。
因为产品本身自带可能用空格是允许的,但是首尾是无意义的空格。所以我应该只考虑String 的 trim();
这里我罗列一下我看到的不错的参考
String str = " Hello Word! ";
//方法1:String.trim();trim()是去掉首尾空格
System.out.println("1:"+str.trim());
//方法2:str.replaceAll(" ", ""); 去掉所有空格,包括首尾、中间
String str2 = str.replaceAll(" ", "");
System.out.println("2:"+str2);
//方法3:或者replaceAll(" +",""); 去掉所有空格,包括首尾、中间
String str3 = str.replaceAll(" +", "");
System.out.println("3:"+str3);
//方法4:、str = .replaceAll("\\s*", "");可以替换大部分空白字符, 不限于空格 ; \s 可以匹配空格、制表符、换页符等空白字符的其中任意一个。
String str4 = str.replaceAll("\\s*", "");
System.out.println("4:"+str4);
但是我没有想到是,我用了trim(),依然有空格进去?
我有点蒙蔽,是我代码提交姿势不对吗?我又去验证了。要来测试excel,我自己添加了正确产品数据,然后前后加任意空格。导入之后我这条数据OJBK,其余带空格数据依然存在。那么继续找不同。
这是我创建的空格,对应字体是Arial,跟前面一致。
但是下面就很奇葩了。
为什么这里的空格是宋体??? 宋体的删除不掉。
或者是其他?这是一个疑问。
另外是 trim()的定义是什么?
源码是:
public String trim() {
int len = value.length;
int st = 0;
char[] val = value; /* avoid getfield opcode */
while ((st < len) && (val[st] <= ' ')) {
st++;
}
while ((st < len) && (val[len - 1] <= ' ')) {
len--;
}
return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
}
源码大意是 对应字符串弄成char[] ,然后进行首尾二端开始的比较,去除空格的,保留下来的就是首尾不是空格的。逻辑也很清楚很对。那么空格的判断依据是什么?对应判断依据是 ascii 码。对应空格的ASCII码是32,那么你char出来之后的单个ascii码是32,就认为你是空格。就没得了。
很好,知道了大致原理,可以开始搞事了。
if (excelFrom.getSkfPartNo() != null) {
char[] chars = excelFrom.getSkfPartNo().toCharArray();
log.info("验证");
if (excelFrom.getSkfPartNo().trim().length() > 250) {
itoInquiryItem.setSkfProductDsgn(excelFrom.getSkfPartNo().trim().substring(0, 250));
} else {
itoInquiryItem.setSkfProductDsgn(excelFrom.getSkfPartNo().trim());
}
}
这是项目的代码,就是对进行校验。
出现结果如下:
32 通过校验,是正常的空格。
然后就是不正经的看着像空格的 12288。
补:处于好奇我去看了一下ASCII 表的数据。
对应 空格的确是32。但是其他好像一般是256。
所以 12288是标识什么?
#12288=全角字符 ,也就是12288 是全角字符的空格。那么也就破案了。因为字体Arial下,空格应该是半角空格,所以32是正确的。对应的12288是宋体,给你整了全角的空格。所以就是为什么二个字体不一样,到程序中就是trim没办法解析。
网上的处理方式:
对应全角替换成 “”,然后进行trim();
str = str.replace((char) 12288, ' ');
str=str.trim();
不过因为项目需求中,在产品内部的空格没办法去除,替换就会导致产品不准。所以这个还是满足去空格功能还是可以正常实现。先空格替换,然后去除首尾空格。似乎可以满足条件
??????为什么打问号呢,因为网上普遍都是 poi导入的excel 存在默认值为160的情况。
比如上面这样的,但是我的是12288.同时也存在这个160.我略一思索,如果接下这个处理任意空格的,那么代码写死也赶不上乱七八糟出现的空格。所以机智的我,否了这个需求。
这就很nice啊。
不过如果仅仅只是poi导入的字符串空格ACCILL值 是160的话。对应上面处理方式很值得借用。
/**
* @Description: 自定义去空格 excel专用 poi导入的字符串空格ASCll值:160,而空格(Space)的ASCII码值是:32
* @Author:
* @Date: 14:44 2019/4/1
*/
public static String StringTrim(String str){
return str.replaceAll("[\\s\\u00A0]+","").trim();
}
本次百度大力支持的参考网址是 : https://www.cnblogs.com/w-yu-chen/p/10636463.html