This is an automated email from the ASF dual-hosted git repository.

pjfanning pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/poi.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 4240fced31 more 'safe' conversions (#1110)
4240fced31 is described below

commit 4240fced3145f373e15a731ed07328066ce50d65
Author: PJ Fanning <[email protected]>
AuthorDate: Wed Jun 3 21:46:39 2026 +0100

    more 'safe' conversions (#1110)
---
 .../main/java/org/apache/poi/ss/formula/functions/Address.java   | 7 ++++---
 .../main/java/org/apache/poi/ss/formula/functions/Bin2Dec.java   | 3 ++-
 .../apache/poi/ss/formula/functions/CalendarFieldFunction.java   | 5 +++--
 .../main/java/org/apache/poi/ss/formula/functions/DateFunc.java  | 5 +++--
 poi/src/main/java/org/apache/poi/ss/formula/functions/EDate.java | 3 ++-
 .../main/java/org/apache/poi/ss/formula/functions/EOMonth.java   | 4 +++-
 poi/src/main/java/org/apache/poi/ss/formula/functions/MathX.java | 9 +++++----
 .../org/apache/poi/ss/formula/functions/NumericFunction.java     | 9 +++++++--
 .../main/java/org/apache/poi/ss/formula/functions/Poisson.java   | 5 +++--
 .../main/java/org/apache/poi/ss/formula/functions/Quotient.java  | 3 ++-
 10 files changed, 34 insertions(+), 19 deletions(-)

diff --git a/poi/src/main/java/org/apache/poi/ss/formula/functions/Address.java 
b/poi/src/main/java/org/apache/poi/ss/formula/functions/Address.java
index a72ed69656..daf05b2147 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/functions/Address.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/functions/Address.java
@@ -19,6 +19,7 @@ package org.apache.poi.ss.formula.functions;
 import org.apache.poi.ss.formula.SheetNameFormatter;
 import org.apache.poi.ss.formula.eval.*;
 import org.apache.poi.ss.util.CellReference;
+import org.apache.poi.util.MathUtil;
 
 /**
  * Creates a text reference as text, given specified row and column numbers.
@@ -37,12 +38,12 @@ public class Address implements Function {
         try {
             boolean pAbsRow, pAbsCol;
 
-            int row =  (int)NumericFunction.singleOperandEvaluate(args[0], 
srcRowIndex, srcColumnIndex);
-            int col =  (int)NumericFunction.singleOperandEvaluate(args[1], 
srcRowIndex, srcColumnIndex);
+            int row = 
MathUtil.safeDoubleToInt(NumericFunction.singleOperandEvaluate(args[0], 
srcRowIndex, srcColumnIndex));
+            int col = 
MathUtil.safeDoubleToInt(NumericFunction.singleOperandEvaluate(args[1], 
srcRowIndex, srcColumnIndex));
 
             int refType;
             if (args.length > 2  &&  args[2] != MissingArgEval.instance) {
-                refType = (int)NumericFunction.singleOperandEvaluate(args[2], 
srcRowIndex, srcColumnIndex);
+                refType = 
MathUtil.safeDoubleToInt(NumericFunction.singleOperandEvaluate(args[2], 
srcRowIndex, srcColumnIndex));
             } else {
                 refType = REF_ABSOLUTE;     // this is also the default if 
parameter is not given
             }
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/functions/Bin2Dec.java 
b/poi/src/main/java/org/apache/poi/ss/formula/functions/Bin2Dec.java
index 7096f91567..65c1b925b4 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/functions/Bin2Dec.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/functions/Bin2Dec.java
@@ -22,6 +22,7 @@ import org.apache.poi.ss.formula.eval.NumberEval;
 import org.apache.poi.ss.formula.eval.OperandResolver;
 import org.apache.poi.ss.formula.eval.RefEval;
 import org.apache.poi.ss.formula.eval.ValueEval;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.StringUtil;
 
 /**
@@ -100,7 +101,7 @@ public class Bin2Dec extends Fixed1ArgFunction implements 
FreeRefFunction {
 
         for (int i = 0; i < numBits; i++) {
             int bit = Integer.parseInt(unsigned.substring(i, i + 1));
-            int term = (int) (bit * Math.pow(2, power));
+            int term = MathUtil.safeDoubleToInt(bit * Math.pow(2, power));
             sum += term;
             power--;
         }
diff --git 
a/poi/src/main/java/org/apache/poi/ss/formula/functions/CalendarFieldFunction.java
 
b/poi/src/main/java/org/apache/poi/ss/formula/functions/CalendarFieldFunction.java
index df2930e72b..1d8e7e4571 100644
--- 
a/poi/src/main/java/org/apache/poi/ss/formula/functions/CalendarFieldFunction.java
+++ 
b/poi/src/main/java/org/apache/poi/ss/formula/functions/CalendarFieldFunction.java
@@ -25,6 +25,7 @@ import org.apache.poi.ss.formula.eval.NumberEval;
 import org.apache.poi.ss.formula.eval.OperandResolver;
 import org.apache.poi.ss.formula.eval.ValueEval;
 import org.apache.poi.ss.usermodel.DateUtil;
+import org.apache.poi.util.MathUtil;
 
 /**
  * Implementation of Excel functions Date parsing functions:
@@ -61,8 +62,8 @@ public final class CalendarFieldFunction extends 
Fixed1ArgFunction {
 
     private int getCalField(double serialDate) {
        // For some reason, a date of 0 in Excel gets shown
-       //  as the non existant 1900-01-00
-        if (((int)serialDate) == 0) {
+       //  as the non-existent 1900-01-00
+        if (MathUtil.safeDoubleToInt(serialDate) == 0) {
             switch (_dateFieldId) {
                 case Calendar.YEAR: return 1900;
                 case Calendar.MONTH: return 1;
diff --git 
a/poi/src/main/java/org/apache/poi/ss/formula/functions/DateFunc.java 
b/poi/src/main/java/org/apache/poi/ss/formula/functions/DateFunc.java
index 88e19354a0..72e233c02f 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/functions/DateFunc.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/functions/DateFunc.java
@@ -25,6 +25,7 @@ import org.apache.poi.ss.formula.eval.NumberEval;
 import org.apache.poi.ss.formula.eval.ValueEval;
 import org.apache.poi.ss.usermodel.DateUtil;
 import org.apache.poi.util.LocaleUtil;
+import org.apache.poi.util.MathUtil;
 
 
 /**
@@ -43,7 +44,7 @@ public final class DateFunc extends Fixed3ArgFunction {
             double d0 = NumericFunction.singleOperandEvaluate(arg0, 
srcRowIndex, srcColumnIndex);
             double d1 = NumericFunction.singleOperandEvaluate(arg1, 
srcRowIndex, srcColumnIndex);
             double d2 = NumericFunction.singleOperandEvaluate(arg2, 
srcRowIndex, srcColumnIndex);
-            result = evaluate(getYear(d0), (int) (d1 - 1), (int) d2);
+            result = evaluate(getYear(d0), MathUtil.safeDoubleToInt(d1 - 1),  
MathUtil.safeDoubleToInt(d2));
             NumericFunction.checkValue(result);
         } catch (EvaluationException e) {
             return e.getErrorEval();
@@ -101,7 +102,7 @@ public final class DateFunc extends Fixed3ArgFunction {
     }
 
     private static int getYear(double d) {
-        int year = (int)d;
+        int year = MathUtil.safeDoubleToInt(d);
 
         if (year < 0) {
             return -1;
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/functions/EDate.java 
b/poi/src/main/java/org/apache/poi/ss/formula/functions/EDate.java
index 3faec3dd84..218583b6f2 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/functions/EDate.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/functions/EDate.java
@@ -29,6 +29,7 @@ import org.apache.poi.ss.formula.eval.RefEval;
 import org.apache.poi.ss.formula.eval.ValueEval;
 import org.apache.poi.ss.usermodel.DateUtil;
 import org.apache.poi.util.LocaleUtil;
+import org.apache.poi.util.MathUtil;
 
 /**
  * Implementation for Excel EDATE () function.
@@ -42,7 +43,7 @@ public class EDate implements FreeRefFunction {
         }
         try {
             double startDateAsNumber = getValue(args[0]);
-            int offsetInMonthAsNumber = (int) getValue(args[1]);
+            int offsetInMonthAsNumber = 
MathUtil.safeDoubleToInt(getValue(args[1]));
 
             Date startDate = DateUtil.getJavaDate(startDateAsNumber);
             if (startDate == null) {
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/functions/EOMonth.java 
b/poi/src/main/java/org/apache/poi/ss/formula/functions/EOMonth.java
index 68f92abec5..41c639026b 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/functions/EOMonth.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/functions/EOMonth.java
@@ -27,6 +27,7 @@ import org.apache.poi.ss.formula.eval.NumberEval;
 import org.apache.poi.ss.formula.eval.ValueEval;
 import org.apache.poi.ss.usermodel.DateUtil;
 import org.apache.poi.util.LocaleUtil;
+import org.apache.poi.util.MathUtil;
 
 /**
  * Implementation for the Excel EOMONTH() function.
@@ -53,7 +54,8 @@ public class EOMonth implements FreeRefFunction {
 
         try {
             double startDateAsNumber = 
NumericFunction.singleOperandEvaluate(args[0], ec.getRowIndex(), 
ec.getColumnIndex());
-            int months = (int) NumericFunction.singleOperandEvaluate(args[1], 
ec.getRowIndex(), ec.getColumnIndex());
+            int months = MathUtil.safeDoubleToInt(
+                    NumericFunction.singleOperandEvaluate(args[1], 
ec.getRowIndex(), ec.getColumnIndex()));
 
             // Excel treats date 0 as 1900-01-00; EOMONTH results in 1900-01-31
             if (startDateAsNumber >= 0.0 && startDateAsNumber < 1.0) {
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/functions/MathX.java 
b/poi/src/main/java/org/apache/poi/ss/formula/functions/MathX.java
index 71c62883ff..462ac35f8f 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/functions/MathX.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/functions/MathX.java
@@ -19,6 +19,7 @@ package org.apache.poi.ss.formula.functions;
 
 import org.apache.poi.ss.util.NumberToTextConverter;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
 
 import java.math.BigDecimal;
 import java.math.MathContext;
@@ -56,7 +57,7 @@ final class MathX {
     }
 
     public static double round(double n, double p) {
-        return round(n, (int)p);
+        return round(n, MathUtil.safeDoubleToInt(p));
     }
 
 
@@ -81,7 +82,7 @@ final class MathX {
     }
 
     public static double roundUp(double n, double p) {
-        return roundUp(n, (int)p);
+        return roundUp(n, MathUtil.safeDoubleToInt(p));
     }
 
 
@@ -105,7 +106,7 @@ final class MathX {
     }
 
     public static double roundDown(double n, double p) {
-        return roundDown(n, (int)p);
+        return roundDown(n, MathUtil.safeDoubleToInt(p));
     }
 
     private static double round(double n, int p, java.math.RoundingMode 
rounding) {
@@ -316,7 +317,7 @@ final class MathX {
     }
 
     public static double factorial(double d) {
-        return factorial((int)d);
+        return factorial(MathUtil.safeDoubleToInt(d));
     }
 
 
diff --git 
a/poi/src/main/java/org/apache/poi/ss/formula/functions/NumericFunction.java 
b/poi/src/main/java/org/apache/poi/ss/formula/functions/NumericFunction.java
index 785a37df8d..3b3be9e1ff 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/functions/NumericFunction.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/functions/NumericFunction.java
@@ -21,6 +21,7 @@ import static 
org.apache.poi.ss.formula.eval.ErrorEval.VALUE_INVALID;
 
 import org.apache.poi.ss.formula.eval.*;
 import org.apache.poi.util.LocaleUtil;
+import org.apache.poi.util.MathUtil;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
@@ -91,7 +92,7 @@ public abstract class NumericFunction implements Function {
             double d1 = args.length == 1 ? 2.0 : 
singleOperandEvaluate(args[1], srcRowIndex, srcColumnIndex);
 
             // second arg converts to int by truncating toward zero
-            int nPlaces = (int)d1;
+            int nPlaces = MathUtil.safeDoubleToInt(d1);
 
             if (nPlaces > 127) {
                 return VALUE_INVALID;
@@ -146,7 +147,11 @@ public abstract class NumericFunction implements Function {
     public static final Function CEILING = twoDouble(MathX::ceiling);
 
     public static final Function COMBIN = twoDouble((d0, d1) ->
-        (d0 > Integer.MAX_VALUE || d1 > Integer.MAX_VALUE) ? 
ErrorEval.NUM_ERROR : MathX.nChooseK((int) d0, (int) d1));
+        (d0 > Integer.MAX_VALUE || d1 > Integer.MAX_VALUE) ?
+                ErrorEval.NUM_ERROR :
+                MathX.nChooseK(
+                        MathUtil.safeDoubleToInt(d0),
+                        MathUtil.safeDoubleToInt(d1)));
 
     public static final Function FLOOR = twoDouble((d0, d1) ->
         (d1 == ZERO) ? (d0 == ZERO ? ZERO : ErrorEval.DIV_ZERO) : 
MathX.floor(d0, d1));
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/functions/Poisson.java 
b/poi/src/main/java/org/apache/poi/ss/formula/functions/Poisson.java
index 5168347e84..29c49e0052 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/functions/Poisson.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/functions/Poisson.java
@@ -24,6 +24,7 @@ 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.ValueEval;
+import org.apache.poi.util.MathUtil;
 
 public class Poisson implements FreeRefFunction {
 
@@ -88,8 +89,8 @@ public class Poisson implements FreeRefFunction {
             boolean cumulative = ((BoolEval)arg2).getBooleanValue();
             PoissonDistribution poissonDistribution = new 
PoissonDistribution(mean);
             double result = cumulative ?
-                    poissonDistribution.cumulativeProbability((int) x) :
-                    poissonDistribution.probability((int) x);
+                    poissonDistribution.cumulativeProbability( 
MathUtil.safeDoubleToInt(x)) :
+                    
poissonDistribution.probability(MathUtil.safeDoubleToInt(x));
 
             // check the result
             NumericFunction.checkValue(result);
diff --git 
a/poi/src/main/java/org/apache/poi/ss/formula/functions/Quotient.java 
b/poi/src/main/java/org/apache/poi/ss/formula/functions/Quotient.java
index 36ddf437ac..92ec36d97d 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/functions/Quotient.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/functions/Quotient.java
@@ -20,6 +20,7 @@ package org.apache.poi.ss.formula.functions;
 import org.apache.poi.ss.formula.OperationEvaluationContext;
 
 import org.apache.poi.ss.formula.eval.*;
+import org.apache.poi.util.MathUtil;
 
 /**
  * <p>Implementation for Excel QUOTIENT () function.
@@ -62,7 +63,7 @@ public class Quotient extends Fixed2ArgFunction implements 
FreeRefFunction {
             return ErrorEval.DIV_ZERO;
         }
 
-        return new NumberEval((int)(enumerator / denominator));
+        return new NumberEval(MathUtil.safeDoubleToInt(enumerator / 
denominator));
     }
 
     @Override


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to