一. 问题背景
在我的项目中,Java基于Easyexcel读取到Excel的值全都是String类型的(没有使用数据结构类),尽管Excel中数字为数值类型,Easyexcel也会读取为String类型返回。当我想将读取到的数据另存为另一个Excel文件时,它写入Excel文件的数值依然是字符串形式的,这将导致我在Excel中没办法对数据进行数值相关函数的计算。
因此,我需要在程序中将所有String类型的数字转化为Double类型,同时原本就为字符串的类型保持不变。
下面我将以这个List为例,来模拟我读入的数据类型:
List<Map<Integer,Object>> list = new ArrayList<Map<Integer,Object>>();
Map<Integer,Object> map1 = new HashMap<Integer, Object>();
map1.put(0, "apple");
map1.put(1, "1");
map1.put(2, "2");
list.add(map1);
Map<Integer,Object> map2 = new HashMap<Integer, Object>();
map2.put(0, "banana");
map2.put(1, "6");
map2.put(2, "7");
list.add(map2);
System.out.println(list);
输出为:
[{0=apple, 1=1, 2=2}, {0=banana, 1=6, 2=7}]
我读入的Excel格式与上面这个格式类似,其中List中每一组Map代表Excel中每一行数据,Map中每一个元素代表每一个单元格的数据,例如上面这个格式的数据在Excel中为:
关于Java读取Excel数据的方法可以参考:【亲测可用】Java基于EasyExcel读取一维及二维Excel数据并存入数组
二. 判断字符串中是否为数字
这里用正则化的方法判断String类型的元素中是否为数字,使用方法如下:
String value = "123";
Pattern pattern = Pattern.compile("-?[0-9]+.?[0-9]*");
System.out.println(pattern.matcher(value).matches());
输出为:
true
当value = 数字
时,pattern.matcher(value).matches()
返回true
;否则返回false
。这里的数字包括整数、小数、正数和负数。
三. 循环判断List中数据类型并修改
遍历List和Map,判断Map中每个元素的数据,若为数字则修改数据类型:
Pattern pattern = Pattern.compile("-?[0-9]+.?[0-9]*");
for(int i=0;i<list.size();i++)
{
Map<Integer, Object> map = list.get(i);
for(int j=0;j<map.size();j++)
{
String value = map.get(j).toString();
if(pattern.matcher(value).matches())
{
map.put(j, Double.parseDouble(value));
}
else
{
map.put(j, value);
}
}
list.set(i, map);
}
四. 完整代码
List<Map<Integer,Object>> list = new ArrayList<Map<Integer,Object>>();
Map<Integer,Object> map1 = new HashMap<Integer, Object>();
map1.put(0, "apple");
map1.put(1, "1");
map1.put(2, "2.090");
list.add(map1);
Map<Integer,Object> map2 = new HashMap<Integer, Object>();
map2.put(0, "banana");
map2.put(1, "6.8979");
map2.put(2, "7");
list.add(map2);
System.out.println("原始:"+list);
Pattern pattern = Pattern.compile("-?[0-9]+.?[0-9]*");
for(int i=0;i<list.size();i++)
{
Map<Integer, Object> map = list.get(i);
for(int j=0;j<map.size();j++)
{
String value = map.get(j).toString();
if(pattern.matcher(value).matches())
{
map.put(j, Double.parseDouble(value));
}
else
{
map.put(j, value);
}
}
list.set(i, map);
}
System.out.println("处理后:"+list);
输出为:
原始:[{0=apple, 1=1, 2=2}, {0=banana, 1=6, 2=7}]
处理后:[{0=apple, 1=1.0, 2=2.0}, {0=banana, 1=6.0, 2=7.0}]