Commit a77254d3287f885d8151057ca2fd8e249166fa0a

Authored by 王彬
1 parent 2945681a
Exists in master

fix a bug about format fraction to string

src/main/java/com/taover/easyexcel/metadata/format/POIFractionFormatOptimization.java
@@ -20,7 +20,7 @@ import org.apache.poi.ss.formula.eval.NotImplementedException; @@ -20,7 +20,7 @@ import org.apache.poi.ss.formula.eval.NotImplementedException;
20 @SuppressWarnings("serial") 20 @SuppressWarnings("serial")
21 public class POIFractionFormatOptimization extends Format { 21 public class POIFractionFormatOptimization extends Format {
22 private final String wholePartFormatString; 22 private final String wholePartFormatString;
23 - private final Format decimalFormatForIntStr = new DecimalFormat("#"); 23 + private final Format decimalFormatForIntStr = new DecimalFormat("#.#");
24 24
25 /** 25 /**
26 * Single parameter ctor 26 * Single parameter ctor
@@ -32,74 +32,17 @@ public class POIFractionFormatOptimization extends Format { @@ -32,74 +32,17 @@ public class POIFractionFormatOptimization extends Format {
32 32
33 public String format(Number num) { 33 public String format(Number num) {
34 final double doubleValue = num.doubleValue(); 34 final double doubleValue = num.doubleValue();
35 -  
36 - final boolean isNeg = (doubleValue < 0.0f) ? true : false;  
37 - final double absDoubleValue = Math.abs(doubleValue);  
38 -  
39 - final double wholePart = Math.floor(absDoubleValue);  
40 - final double decPart = absDoubleValue - wholePart;  
41 - if (wholePart + decPart == 0) {  
42 - return "0";  
43 - }  
44 -  
45 - // if the absolute value is smaller than 1 over the exact or maxDenom  
46 - // you can stop here and return "0"  
47 - // reciprocal is result of an int devision ... and so it's nearly always 0  
48 - // double reciprocal = 1/Math.max(exactDenom, maxDenom);  
49 - // if (absDoubleValue < reciprocal) {  
50 - // return "0";  
51 - // }  
52 -  
53 - //this is necessary to prevent overflow in the maxDenom calculation  
54 - if (Double.compare(decPart, 0) == 0){  
55 - StringBuilder sb = new StringBuilder();  
56 - if (isNeg){  
57 - sb.append("-");  
58 - }  
59 - //sb.append((int)wholePart); //old code  
60 - sb.append(decimalFormatForIntStr.format(wholePart));  
61 - return sb.toString();  
62 - }  
63 -  
64 Fraction fract = null; 35 Fraction fract = null;
65 try{ 36 try{
66 fract = Fraction.getFraction(doubleValue); 37 fract = Fraction.getFraction(doubleValue);
67 } catch (RuntimeException e){ 38 } catch (RuntimeException e){
68 - return Double.toString(doubleValue); 39 + return decimalFormatForIntStr.format(doubleValue);
69 } 40 }
70 -  
71 - StringBuilder sb = new StringBuilder();  
72 -  
73 - //now format the results  
74 - if (isNeg){  
75 - sb.append("-");  
76 - }  
77 -  
78 - //if whole part has to go into the numerator  
79 if ("".equals(wholePartFormatString)){ 41 if ("".equals(wholePartFormatString)){
80 - //int trueNum = (fract.getDenominator()*(int)wholePart)+fract.getNumerator(); //old code  
81 - //sb.append(trueNum).append("/").append(fract.getDenominator()); //old code  
82 - sb.append(decimalFormatForIntStr.format(fract.getDenominator()*wholePart+fract.getNumerator())).append("/").append(fract.getDenominator());  
83 - return sb.toString();  
84 - }  
85 -  
86 - //short circuit if fraction is 0 or 1  
87 - if (fract.getNumerator() == 0){  
88 - //sb.append(Integer.toString((int)wholePart)); //old code  
89 - sb.append(decimalFormatForIntStr.format(wholePart));  
90 - return sb.toString();  
91 - } else if (fract.getNumerator() == fract.getDenominator()){  
92 - //sb.append(Integer.toString((int)wholePart+1)); //old code  
93 - sb.append(decimalFormatForIntStr.format(wholePart+1));  
94 - return sb.toString();  
95 - }  
96 - //as mentioned above, this ignores the exact space formatting in Excel  
97 - if (wholePart > 0){  
98 - //sb.append(Integer.toString((int)wholePart)).append(" "); //old code  
99 - sb.append(decimalFormatForIntStr.format(wholePart)).append(" "); 42 + return fract.toString();
  43 + }else {
  44 + return fract.toProperString();
100 } 45 }
101 - sb.append(fract.getNumerator()).append("/").append(fract.getDenominator());  
102 - return sb.toString();  
103 } 46 }
104 47
105 public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) { 48 public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
src/test/java/com/taover/easyexcel/test/WbTest.java
@@ -13,7 +13,8 @@ public class WbTest { @@ -13,7 +13,8 @@ public class WbTest {
13 //File dataFile = new File("C:\\Users\\Administrator\\Desktop\\数据为空\\好合意商城_20210127_16_47(1).xlsx"); 13 //File dataFile = new File("C:\\Users\\Administrator\\Desktop\\数据为空\\好合意商城_20210127_16_47(1).xlsx");
14 //File dataFile = new File("C:\\Users\\Administrator\\Desktop\\Excel隐藏行\\配送确认1.16(1).xlsx"); 14 //File dataFile = new File("C:\\Users\\Administrator\\Desktop\\Excel隐藏行\\配送确认1.16(1).xlsx");
15 //File dataFile = new File("C:\\Users\\Administrator\\Desktop\\Excel隐藏行\\吉祥三宝-20210128-29条(1).xlsx"); 15 //File dataFile = new File("C:\\Users\\Administrator\\Desktop\\Excel隐藏行\\吉祥三宝-20210128-29条(1).xlsx");
16 - File dataFile = new File("C:\\Users\\Administrator\\Desktop\\读入错误.xlsx"); 16 + //File dataFile = new File("C:\\Users\\Administrator\\Desktop\\读入错误\\数值读入错误.xlsx");
  17 + File dataFile = new File("C:\\Users\\Administrator\\Desktop\\读入错误\\数值读入错误-测试.xlsx");
17 //File dataFile = new File("C:\\Users\\Administrator\\Desktop\\表头匹配-测试文件\\多sheet-多个可用-数据有无.xlsx"); 18 //File dataFile = new File("C:\\Users\\Administrator\\Desktop\\表头匹配-测试文件\\多sheet-多个可用-数据有无.xlsx");
18 List<List<Object>> data = transListMapTo2List(EasyExcel.read(dataFile).readHiddenRow(false).headRowNumber(0).doReadSelectedSync()); 19 List<List<Object>> data = transListMapTo2List(EasyExcel.read(dataFile).readHiddenRow(false).headRowNumber(0).doReadSelectedSync());
19 for(List<Object> row: data) { 20 for(List<Object> row: data) {