]> source.dussan.org Git - poi.git/commitdiff
Bug 55036: patch for missing function Dec2HEx
authorCédric Walter <cedricwalter@apache.org>
Fri, 11 Oct 2013 19:16:43 +0000 (19:16 +0000)
committerCédric Walter <cedricwalter@apache.org>
Fri, 11 Oct 2013 19:16:43 +0000 (19:16 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1531395 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
src/java/org/apache/poi/ss/formula/functions/Dec2Hex.java
test-data/spreadsheet/FormulaEvalTestData.xls

index a3898a7018efa7a29763c28341b41fa4cfb12a3a..224cbf12ee92e4d2b2f9e6e6f0d89a65f0822ca0 100644 (file)
@@ -89,7 +89,7 @@ public final class AnalysisToolPak implements UDFFinder {
         r(m, "CUMIPMT", null);
         r(m, "CUMPRINC", null);
         r(m, "DEC2BIN", Dec2Bin.instance);
-        r(m, "DEC2HEX", null);
+        r(m, "DEC2HEX", Dec2Hex.instance);
         r(m, "DEC2OCT", null);
         r(m, "DELTA", Delta.instance);
         r(m, "DISC", null);
index c4d36214e5d09b3a981c60baec7f0c7ac984104c..62462b029dfe1e239429e9177f51487852a6787f 100644 (file)
@@ -45,7 +45,7 @@ import org.apache.poi.ss.formula.eval.*;
  * <ul>\r
  * <li>If this argument is omitted, this function uses the minimum number of characters necessary.</li>\r
  * <li>If this function requires more than places characters, it returns the #NUM! error value.</li>\r
- * <li>If this argument is nonnumeric, this function returns the #VALUE! error value.</li>\r
+ * <li>If this argument is non numeric, this function returns the #VALUE! error value.</li>\r
  * <li>If this argument is negative, this function returns the #NUM! error value.</li>\r
  * <li>If this argument contains a decimal value, this function ignores the numbers to the right side of the decimal point.</li>\r
  * </ul>\r
@@ -54,9 +54,11 @@ import org.apache.poi.ss.formula.eval.*;
  */\r
 public final class Dec2Hex extends Var1or2ArgFunction implements FreeRefFunction {\r
 \r
-    private final static long MIN_VALUE = new Long("-549755813888").longValue();\r
-    private final static long MAX_VALUE = new Long("549755813887").longValue();\r
-    private final static int DEFAULT_PLACES_VALUE = 10;;\r
+    public static final FreeRefFunction instance = new Dec2Hex();\r
+\r
+    private final static long MIN_VALUE = Long.parseLong("-549755813888");\r
+    private final static long MAX_VALUE = Long.parseLong("549755813887");\r
+    private final static int DEFAULT_PLACES_VALUE = 10;\r
 \r
     public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval number, ValueEval places) {\r
         ValueEval veText1;\r
@@ -81,7 +83,8 @@ public final class Dec2Hex extends Var1or2ArgFunction implements FreeRefFunction
         int placesNumber = 0;\r
         if (number1 < 0) {\r
             placesNumber = DEFAULT_PLACES_VALUE;\r
-        } else  {\r
+        }\r
+        else if (places != null) {\r
             ValueEval placesValueEval;\r
             try {\r
                 placesValueEval = OperandResolver.getSingleValue(places, srcRowIndex, srcColumnIndex);\r
@@ -104,26 +107,32 @@ public final class Dec2Hex extends Var1or2ArgFunction implements FreeRefFunction
             }\r
         }\r
 \r
-        String hex = "";\r
+        String hex;\r
         if (placesNumber != 0) {\r
-            hex = String.format("%0"+placesNumber+"X", number1.intValue() & 0x0FFFFF);\r
+            hex = String.format("%0"+placesNumber+"X", number1.intValue());\r
         }\r
         else {\r
             hex = Integer.toHexString(number1.intValue());\r
         }\r
 \r
+        if (number1 < 0) {\r
+            hex =  "FF"+  hex.substring(2);\r
+        }\r
+\r
         return new StringEval(hex.toUpperCase());\r
     }\r
 \r
     public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0) {\r
-        return this.evaluate(srcRowIndex, srcColumnIndex, arg0, new StringEval(String.valueOf(DEFAULT_PLACES_VALUE)));\r
+        return this.evaluate(srcRowIndex, srcColumnIndex, arg0, null);\r
     }\r
 \r
     public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) {\r
-        if (args.length != 2) {\r
-            return ErrorEval.VALUE_INVALID;\r
+        if (args.length == 1) {\r
+            return evaluate(ec.getRowIndex(), ec.getColumnIndex(), args[0]);\r
         }\r
-        return evaluate(ec.getRowIndex(), ec.getColumnIndex(), args[0], args[1]);\r
+        if (args.length == 2) {\r
+            return evaluate(ec.getRowIndex(), ec.getColumnIndex(), args[0], args[1]);\r
+        }\r
+        return ErrorEval.VALUE_INVALID;\r
     }\r
-\r
-}
\ No newline at end of file
+}\r
index 0414f9eac948e32bde163176898d14f7a3a5d406..4245acb88ddeacc231355438a00267c45ba9f3f7 100644 (file)
Binary files a/test-data/spreadsheet/FormulaEvalTestData.xls and b/test-data/spreadsheet/FormulaEvalTestData.xls differ