You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by fa...@apache.org on 2022/05/28 18:35:56 UTC

svn commit: r1901366 - in /poi/trunk/poi/src: main/java/org/apache/poi/ss/formula/atp/ main/java/org/apache/poi/ss/formula/functions/ test/java/org/apache/poi/ss/formula/functions/

Author: fanningpj
Date: Sat May 28 18:35:56 2022
New Revision: 1901366

URL: http://svn.apache.org/viewvc?rev=1901366&view=rev
Log:
[bug-66097] support FLOOR.PRECISE function

Added:
    poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/FloorPrecise.java
      - copied, changed from r1901195, poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/FloorMath.java
    poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestFloorPrecise.java
      - copied, changed from r1901195, poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestFloorMath.java
Modified:
    poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
    poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Days.java
    poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestDays.java

Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java?rev=1901366&r1=1901365&r2=1901366&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java Sat May 28 18:35:56 2022
@@ -114,6 +114,7 @@ public final class AnalysisToolPak imple
         r(m, "ERFC", null);
         r(m, "FACTDOUBLE", FactDouble.instance);
         r(m, "FLOOR.MATH", FloorMath.instance);
+        r(m, "FLOOR.PRECISE", FloorPrecise.instance);
         r(m, "FVSCHEDULE", null);
         r(m, "GCD", Gcd.instance);
         r(m, "GESTEP", null);

Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Days.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Days.java?rev=1901366&r1=1901365&r2=1901366&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Days.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Days.java Sat May 28 18:35:56 2022
@@ -21,6 +21,7 @@ import java.time.temporal.ChronoUnit;
 import java.util.Date;
 
 import org.apache.poi.ss.formula.OperationEvaluationContext;
+import org.apache.poi.ss.formula.eval.ErrorEval;
 import org.apache.poi.ss.formula.eval.EvaluationException;
 import org.apache.poi.ss.formula.eval.NumberEval;
 import org.apache.poi.ss.formula.eval.OperandResolver;
@@ -54,6 +55,9 @@ public class Days implements FreeRefFunc
 
     @Override
     public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) {
+        if (args.length != 2) {
+            return ErrorEval.VALUE_INVALID;
+        }
         return evaluate(ec.getRowIndex(), ec.getColumnIndex(), args[0], args[1]);
     }
 

Copied: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/FloorPrecise.java (from r1901195, poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/FloorMath.java)
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/FloorPrecise.java?p2=poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/FloorPrecise.java&p1=poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/FloorMath.java&r1=1901195&r2=1901366&rev=1901366&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/FloorMath.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/FloorPrecise.java Sat May 28 18:35:56 2022
@@ -29,16 +29,16 @@ import java.math.RoundingMode;
 import static org.apache.poi.ss.formula.functions.MathX.scaledRoundUsingBigDecimal;
 
 /**
- * Implementation for Excel FLOOR.MATH() function.
+ * Implementation for Excel FLOOR.PRECISE() function.
  * <ul>
- *   <li>https://support.microsoft.com/en-us/office/floor-math-function-c302b599-fbdb-4177-ba19-2c2b1249a2f5</li>
+ *   <li>https://support.microsoft.com/en-us/office/floor-precise-function-f769b468-1452-4617-8dc3-02f842a0702e</li>
  * </ul>
  */
-public final class FloorMath implements FreeRefFunction {
+public final class FloorPrecise implements FreeRefFunction {
 
-    public static final FloorMath instance = new FloorMath();
+    public static final FloorPrecise instance = new FloorPrecise();
 
-    private FloorMath() {}
+    private FloorPrecise() {}
 
     @Override
     public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) {
@@ -53,19 +53,7 @@ public final class FloorMath implements
             double multiplier = 1.0;
             if (args.length > 1) {
                 Double arg1Val = evaluateValue(args[1], ec.getRowIndex(), ec.getColumnIndex());
-                multiplier = arg1Val != null ? arg1Val.doubleValue() : 1.0;
-            }
-            boolean roundNegativeNumsDown = false;
-            if (args.length > 2) {
-                Double arg2Val = evaluateValue(args[2], ec.getRowIndex(), ec.getColumnIndex());
-                roundNegativeNumsDown = arg2Val != null && arg2Val.doubleValue() < 0.0;
-            }
-            if (roundNegativeNumsDown && xval < 0.0) {
-                if (multiplier != 1.0) {
-                    RoundingMode mode = multiplier < 0.0 ? RoundingMode.FLOOR : RoundingMode.CEILING;
-                    return new NumberEval(scaledRoundUsingBigDecimal(xval, multiplier, mode));
-                }
-                return new NumberEval(Math.ceil(xval));
+                multiplier = arg1Val != null ? Math.abs(arg1Val.doubleValue()) : 1.0;
             }
             if (multiplier != 1.0) {
                 RoundingMode mode = multiplier < 0.0 ? RoundingMode.CEILING : RoundingMode.FLOOR;

Modified: poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestDays.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestDays.java?rev=1901366&r1=1901365&r2=1901366&view=diff
==============================================================================
--- poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestDays.java (original)
+++ poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestDays.java Sat May 28 18:35:56 2022
@@ -56,6 +56,7 @@ public class TestDays {
             HSSFCell cell = wb.getSheetAt(0).getRow(0).createCell(12);
             assertError(fe, cell, "DAYS(\"15-XYZ\",\"1-FEB-2021\")", FormulaError.VALUE);
             assertError(fe, cell, "DAYS(\"15-MAR-2021\",\"1-XYZ\")", FormulaError.VALUE);
+            assertError(fe, cell, "DAYS(\"15-MAR-2021\")", FormulaError.VALUE);
         }
     }
 

Copied: poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestFloorPrecise.java (from r1901195, poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestFloorMath.java)
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestFloorPrecise.java?p2=poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestFloorPrecise.java&p1=poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestFloorMath.java&r1=1901195&r2=1901366&rev=1901366&view=diff
==============================================================================
--- poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestFloorMath.java (original)
+++ poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestFloorPrecise.java Sat May 28 18:35:56 2022
@@ -31,11 +31,11 @@ import static org.apache.poi.ss.util.Uti
 import static org.apache.poi.ss.util.Utils.assertError;
 
 /**
- * Tests for {@link FloorMath}
+ * Tests for {@link FloorPrecise}
  */
-final class TestFloorMath {
+final class TestFloorPrecise {
 
-    //https://support.microsoft.com/en-us/office/floor-math-function-c302b599-fbdb-4177-ba19-2c2b1249a2f5
+    //https://support.microsoft.com/en-us/office/floor-precise-function-f769b468-1452-4617-8dc3-02f842a0702e
     @Test
     void testMicrosoftExamples() throws IOException {
         try (HSSFWorkbook wb = new HSSFWorkbook()) {
@@ -43,15 +43,11 @@ final class TestFloorMath {
             HSSFRow row = sheet.createRow(0);
             HSSFCell cell = row.createCell(0);
             HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
-            assertDouble(fe, cell, "FLOOR.MATH(24.3,5)", 20.0, 0.00000000000001);
-            assertDouble(fe, cell, "FLOOR.MATH(6.7)", 6.0, 0.00000000000001);
-            assertDouble(fe, cell, "FLOOR.MATH(-8.1,2)", -10.0, 0.00000000000001);
-            assertDouble(fe, cell, "FLOOR.MATH(-5.5,2,-1)", -4.0, 0.00000000000001);
-
-            assertDouble(fe, cell, "FLOOR.MATH(-2.5,-2)", -4.0, 0.00000000000001);
-            assertDouble(fe, cell, "FLOOR.MATH(-2.5,-2,-1)", -2.0, 0.00000000000001);
-            assertDouble(fe, cell, "FLOOR.MATH(2.5,-2)", 2.0, 0.00000000000001);
-            assertDouble(fe, cell, "FLOOR.MATH(0.234,0.01)", 0.23, 0.00000000000001);
+            assertDouble(fe, cell, "FLOOR.PRECISE(-3.2,-1)", -4, 0.00000000000001);
+            assertDouble(fe, cell, "FLOOR.PRECISE(3.2,1)", 3, 0.00000000000001);
+            assertDouble(fe, cell, "FLOOR.PRECISE(-3.2,1)", -4, 0.00000000000001);
+            assertDouble(fe, cell, "FLOOR.PRECISE(3.2,-1)", 3, 0.00000000000001);
+            assertDouble(fe, cell, "FLOOR.PRECISE(3.2)", 3, 0.00000000000001);
         }
     }
 
@@ -62,7 +58,7 @@ final class TestFloorMath {
             HSSFRow row = sheet.createRow(0);
             HSSFCell cell = row.createCell(0);
             HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
-            assertError(fe, cell, "FLOOR.MATH()", FormulaError.VALUE);
+            assertError(fe, cell, "FLOOR.PRECISE()", FormulaError.VALUE);
         }
     }
 
@@ -73,7 +69,7 @@ final class TestFloorMath {
             HSSFRow row = sheet.createRow(0);
             HSSFCell cell = row.createCell(0);
             HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
-            assertError(fe, cell, "FLOOR.MATH(\"abc\")", FormulaError.VALUE);
+            assertError(fe, cell, "FLOOR.PRECISE(\"abc\")", FormulaError.VALUE);
         }
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org