diff --git a/src/java/org/apache/poi/ss/formula/eval/RelationalOperationEval.java b/src/java/org/apache/poi/ss/formula/eval/RelationalOperationEval.java
index 8b3be191994..813c585584c 100644
--- a/src/java/org/apache/poi/ss/formula/eval/RelationalOperationEval.java
+++ b/src/java/org/apache/poi/ss/formula/eval/RelationalOperationEval.java
@@ -28,7 +28,7 @@ Licensed to the Apache Software Foundation (ASF) under one or more
*/
public abstract class RelationalOperationEval extends Fixed2ArgFunction {
- /**
+ /**
* Converts a standard compare result (-1, 0, 1) to true
or false
* according to subclass' comparison type.
*/
@@ -45,7 +45,7 @@ public abstract class RelationalOperationEval extends Fixed2ArgFunction {
* Bool.TRUE > Bool.FALSE
* Bool.FALSE == Blank
*
- * Strings are never converted to numbers or booleans
+ * Strings can converted to numbers or booleans to compare
* String > any number. ALWAYS
* Non-empty String > Blank
* Empty String == Blank
@@ -94,6 +94,15 @@ private static int doCompare(ValueEval va, ValueEval vb) {
if (vb instanceof BoolEval) {
return -1;
}
+
+ try {
+ Double nA = OperandResolver.coerceValueToDouble(va);
+ Double nB = OperandResolver.coerceValueToDouble(vb);
+ return NumberComparer.compare(nA, nB);
+ } catch (Exception e) {
+ //
+ }
+
if (va instanceof StringEval) {
if (vb instanceof StringEval) {
StringEval sA = (StringEval) va;
@@ -105,13 +114,6 @@ private static int doCompare(ValueEval va, ValueEval vb) {
if (vb instanceof StringEval) {
return -1;
}
- if (va instanceof NumberEval) {
- if (vb instanceof NumberEval) {
- NumberEval nA = (NumberEval) va;
- NumberEval nB = (NumberEval) vb;
- return NumberComparer.compare(nA.getNumberValue(), nB.getNumberValue());
- }
- }
throw new IllegalArgumentException("Bad operand types (" + va.getClass().getName() + "), ("
+ vb.getClass().getName() + ")");
}