From a77254d3287f885d8151057ca2fd8e249166fa0a Mon Sep 17 00:00:00 2001 From: 王彬 Date: Fri, 26 Feb 2021 11:48:12 +0800 Subject: [PATCH] fix a bug about format fraction to string --- src/main/java/com/taover/easyexcel/metadata/format/POIFractionFormatOptimization.java | 67 +++++-------------------------------------------------------------- src/test/java/com/taover/easyexcel/test/WbTest.java | 3 ++- 2 files changed, 7 insertions(+), 63 deletions(-) diff --git a/src/main/java/com/taover/easyexcel/metadata/format/POIFractionFormatOptimization.java b/src/main/java/com/taover/easyexcel/metadata/format/POIFractionFormatOptimization.java index 689e56e..1d222bf 100644 --- a/src/main/java/com/taover/easyexcel/metadata/format/POIFractionFormatOptimization.java +++ b/src/main/java/com/taover/easyexcel/metadata/format/POIFractionFormatOptimization.java @@ -20,7 +20,7 @@ import org.apache.poi.ss.formula.eval.NotImplementedException; @SuppressWarnings("serial") public class POIFractionFormatOptimization extends Format { private final String wholePartFormatString; - private final Format decimalFormatForIntStr = new DecimalFormat("#"); + private final Format decimalFormatForIntStr = new DecimalFormat("#.#"); /** * Single parameter ctor @@ -32,74 +32,17 @@ public class POIFractionFormatOptimization extends Format { public String format(Number num) { final double doubleValue = num.doubleValue(); - - final boolean isNeg = (doubleValue < 0.0f) ? true : false; - final double absDoubleValue = Math.abs(doubleValue); - - final double wholePart = Math.floor(absDoubleValue); - final double decPart = absDoubleValue - wholePart; - if (wholePart + decPart == 0) { - return "0"; - } - - // if the absolute value is smaller than 1 over the exact or maxDenom - // you can stop here and return "0" - // reciprocal is result of an int devision ... and so it's nearly always 0 - // double reciprocal = 1/Math.max(exactDenom, maxDenom); - // if (absDoubleValue < reciprocal) { - // return "0"; - // } - - //this is necessary to prevent overflow in the maxDenom calculation - if (Double.compare(decPart, 0) == 0){ - StringBuilder sb = new StringBuilder(); - if (isNeg){ - sb.append("-"); - } - //sb.append((int)wholePart); //old code - sb.append(decimalFormatForIntStr.format(wholePart)); - return sb.toString(); - } - Fraction fract = null; try{ fract = Fraction.getFraction(doubleValue); } catch (RuntimeException e){ - return Double.toString(doubleValue); + return decimalFormatForIntStr.format(doubleValue); } - - StringBuilder sb = new StringBuilder(); - - //now format the results - if (isNeg){ - sb.append("-"); - } - - //if whole part has to go into the numerator if ("".equals(wholePartFormatString)){ - //int trueNum = (fract.getDenominator()*(int)wholePart)+fract.getNumerator(); //old code - //sb.append(trueNum).append("/").append(fract.getDenominator()); //old code - sb.append(decimalFormatForIntStr.format(fract.getDenominator()*wholePart+fract.getNumerator())).append("/").append(fract.getDenominator()); - return sb.toString(); - } - - //short circuit if fraction is 0 or 1 - if (fract.getNumerator() == 0){ - //sb.append(Integer.toString((int)wholePart)); //old code - sb.append(decimalFormatForIntStr.format(wholePart)); - return sb.toString(); - } else if (fract.getNumerator() == fract.getDenominator()){ - //sb.append(Integer.toString((int)wholePart+1)); //old code - sb.append(decimalFormatForIntStr.format(wholePart+1)); - return sb.toString(); - } - //as mentioned above, this ignores the exact space formatting in Excel - if (wholePart > 0){ - //sb.append(Integer.toString((int)wholePart)).append(" "); //old code - sb.append(decimalFormatForIntStr.format(wholePart)).append(" "); + return fract.toString(); + }else { + return fract.toProperString(); } - sb.append(fract.getNumerator()).append("/").append(fract.getDenominator()); - return sb.toString(); } public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) { diff --git a/src/test/java/com/taover/easyexcel/test/WbTest.java b/src/test/java/com/taover/easyexcel/test/WbTest.java index 1d0dfe4..67cea72 100644 --- a/src/test/java/com/taover/easyexcel/test/WbTest.java +++ b/src/test/java/com/taover/easyexcel/test/WbTest.java @@ -13,7 +13,8 @@ public class WbTest { //File dataFile = new File("C:\\Users\\Administrator\\Desktop\\数据为空\\好合意商城_20210127_16_47(1).xlsx"); //File dataFile = new File("C:\\Users\\Administrator\\Desktop\\Excel隐藏行\\配送确认1.16(1).xlsx"); //File dataFile = new File("C:\\Users\\Administrator\\Desktop\\Excel隐藏行\\吉祥三宝-20210128-29条(1).xlsx"); - File dataFile = new File("C:\\Users\\Administrator\\Desktop\\读入错误.xlsx"); + //File dataFile = new File("C:\\Users\\Administrator\\Desktop\\读入错误\\数值读入错误.xlsx"); + File dataFile = new File("C:\\Users\\Administrator\\Desktop\\读入错误\\数值读入错误-测试.xlsx"); //File dataFile = new File("C:\\Users\\Administrator\\Desktop\\表头匹配-测试文件\\多sheet-多个可用-数据有无.xlsx"); List> data = transListMapTo2List(EasyExcel.read(dataFile).readHiddenRow(false).headRowNumber(0).doReadSelectedSync()); for(List row: data) { -- libgit2 0.21.2