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]