poi 处理 excel 小数问题 整数多.0 的情况

读取的单元格为 hssfCell,默认 poi 返回的为 double 类型的值,所有先转为 BigDecimal 判断下,再进行返回;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;

/**
 * 获取一个Cell的value,根据cell的不同type,获取不同类型的value,返回String格式
 *
 * @param hssfCell 欲获取value的单元格对象
 * @return 单元格value的String格式
 */
private  String getValue(Cell cell) {
    if (cell.getCellTypeEnum() == CellType.BOOLEAN) {
        // 返回布尔类型的值
        return String.valueOf(cell.getBooleanCellValue());
    } else if (cell.getCellTypeEnum() == CellType.NUMERIC) {
        double doubleVal = cell.getNumericCellValue();
//            return new BigDecimal(Double.toString(doubleVal)).toPlainString();

        // 返回数值类型的值

        //方法一
        Object inputValue = null;// 单元格值
//            String strVal = Double.toString(doubleVal);
//            String[] vals = strVal.split("\\.");
//            if ("".equals(vals[1].replaceAll("0","").trim())){
//                //判断是否含有小数位.0
//                inputValue = Integer.parseInt(vals[0]);
//            }else {
//                inputValue = doubleVal;
//            }
        //方法二
        BigDecimal bdVal = new BigDecimal(doubleVal);
        if ((bdVal + ".0").equals(Double.toString(doubleVal))){
            //判断是否含有小数位.0
            inputValue = bdVal;
        }else{
            inputValue = doubleVal;
        }
        return String.valueOf(inputValue);      //返回String类型
    } else if (cell.getCellTypeEnum() == CellType.STRING){
        // 返回字符串类型的值
        return String.valueOf(cell.getStringCellValue());
    } else {
        // 返回字符串类型的值
        return String.valueOf(cell.getStringCellValue());
    }
}

关于 BigDecimal 的 3 个 toString 方法有何区别,如何选择?

BigDecimal 类有 3 个 toString 方法,分别是 toEngineeringString、toPlainString 和 toString,

从 BigDecimal 的注释中可以看到这 3 个方法的区别:

  • toEngineeringString:有必要时使用工程计数法。工程记数法是一种工程计算中经常使用的记录数字的方法,与科学技术法类似,但要求10的幂必须是3的倍数
  • toPlainString:不使用任何指数
  • toString:有必要时使用科学计数法
不使用指数 科学记数法 工程记数法
2700 2.7 × 10³ 2.7 × 10³
27000 2.7 × 10⁴ 27 × 10³
270000 2.7 × 10⁵ 270 × 10³
2700000 2.7 × 10⁶ 2.7 × 10⁶

代码实例:

public static void toStringComp(){
    BigDecimal bdVal = new BigDecimal("1E11");
    System.out.println(bdVal.toString());
    System.out.println(bdVal.toPlainString());
    System.out.println(bdVal.toEngineeringString());
}

//结果如下
1E+11
100000000000
100E+9
发布了103 篇原创文章 · 获赞 77 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Herishwater/article/details/103141165