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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to