Commit a77254d3287f885d8151057ca2fd8e249166fa0a
1 parent
2945681a
Exists in
master
fix a bug about format fraction to string
Showing
2 changed files
with
7 additions
and
63 deletions
Show diff stats
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) { |