1、背景
一个小功能需要填写数据并上传excel文件,因此点击保存后在后台对文件中的数据进行常规校验,其中就包括使用 trim
方法去除首位空格的操作。
2、问题
填完信息、上传好文件后,保存失败了,发现错误(模拟示例):
java.lang.NumberFormatException: For input string: " 123 "
仔细看可以发现多了空格所以转换失败。
查看代码,发现已经做了trim操作(以下为简单示例):
{
// str为文件中某列的一格数据
String str = " 123 "; // 简单模拟,这里的空格并非具体问题中的空格
String trimmedStr = str.trim();
Long value = Long.valueOf(trimmedStr);
}
百度得知,除了我们平时在通过键盘的空格键输入的空格(ASCII码为32),还有一种空格叫做不间断空格(non-breaking space),ASCII码为160,前端的 就是这种空格。遂回来debug,发现这里空格确实有点特殊,ASCII码为160。而String
类的 trim
方法貌似无法处理这种空格。
3、解决
当然还是得百度。。。
方法就是通过 不间断空格的unicode编码 (\u00A0) 来将这种空格进行替换,可采用以下两种方式
- 将其替换为空字符串
- 将其替换为普通空格
然后再进行 trim
操作
public class Test {
public static void main(String[] args) {
// 模拟特殊空格
char nbsp = 160; // unicode码为 \u00A0
String str = "" + nbsp + nbsp + "123" + nbsp;
// 模拟原场景
System.out.println("------------------trim 无法去除-------------------");
String trimmedStr = str.trim();
System.out.println("trim方法:\n" + trimmedStr);
// Long num = Long.valueOf(trimmedStr);
// System.out.println("num:" + num);
// 替换
System.out.println("\n----------------replace 替换-------------\n");
String trimmedStr1 = str.replace("\u00A0", " ").trim();
Long num1 = Long.valueOf(trimmedStr1);
System.out.println("trimmedStr1:\n" + trimmedStr1);
System.out.println("Long_type_num:\n" + num1);
// 正则写法
System.out.println("\n----------------replaceAll 正则替换-------------\n");
String trimmedStr2 = str.replaceAll("\\u00A0", "");
Long num2 = Long.valueOf(trimmedStr2);
System.out.println("trimmedStr2:\n" + trimmedStr2);
System.out.println("Long_type_num:\n" + num2);
System.out.println("\n--正则替换2--");
String trimmedStr3 = str.replaceAll("\u00A0", "");
Long num3 = Long.valueOf(trimmedStr3);
System.out.println("trimmedStr3:\n" + trimmedStr3);
System.out.println("Long_type_num:\n" + num3);
}
}
// 输出
------------------trim 无法去除-------------------
trim方法:
123
**123* // *表示上一行没法处理的空格
----------------replace 替换-------------
trimmedStr1:
123
Long_type_num:
123
----------------replaceAll 正则替换-------------
trimmedStr2:
123
Long_type_num:
123
--正则替换2--
trimmedStr3:
123
Long_type_num:
123