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() + ")"); }