From f97310c1f6f288efafc49eb328c2222d3ef2840f Mon Sep 17 00:00:00 2001 From: =?utf8?q?C=C3=A9dric=20Walter?= Date: Mon, 4 Nov 2013 21:09:40 +0000 Subject: [PATCH] Bug 55742: Apply patch for Oct2Dec and refactor Hex2Dec to also use BaseNumberUtils.convertToDecimal git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1538765 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/ss/formula/atp/AnalysisToolPak.java | 2 +- .../ss/formula/functions/BaseNumberUtils.java | 78 ++++++++++++++++++ .../poi/ss/formula/functions/Hex2Dec.java | 53 ++---------- .../poi/ss/formula/functions/Oct2Dec.java | 64 ++++++++++++++ .../poi/ss/formula/functions/TestHex2Dec.java | 60 ++++++++++++++ .../poi/ss/formula/functions/TestOct2Dec.java | 63 ++++++++++++++ test-data/spreadsheet/FormulaEvalTestData.xls | Bin 173568 -> 174592 bytes 7 files changed, 273 insertions(+), 47 deletions(-) create mode 100644 src/java/org/apache/poi/ss/formula/functions/BaseNumberUtils.java create mode 100644 src/java/org/apache/poi/ss/formula/functions/Oct2Dec.java create mode 100644 src/testcases/org/apache/poi/ss/formula/functions/TestHex2Dec.java create mode 100644 src/testcases/org/apache/poi/ss/formula/functions/TestOct2Dec.java diff --git a/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java b/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java index 224cbf12ee..34e788f022 100644 --- a/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java +++ b/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java @@ -136,7 +136,7 @@ public final class AnalysisToolPak implements UDFFinder { r(m, "MULTINOMIAL", null); r(m, "NETWORKDAYS", NetworkdaysFunction.instance); r(m, "NOMINAL", null); - r(m, "OCT2BIN", null); + r(m, "OCT2BIN", Oct2Dec.instance); r(m, "OCT2DEC", null); r(m, "OCT2HEX", null); r(m, "ODDFPRICE", null); diff --git a/src/java/org/apache/poi/ss/formula/functions/BaseNumberUtils.java b/src/java/org/apache/poi/ss/formula/functions/BaseNumberUtils.java new file mode 100644 index 0000000000..110e869fbd --- /dev/null +++ b/src/java/org/apache/poi/ss/formula/functions/BaseNumberUtils.java @@ -0,0 +1,78 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.ss.formula.functions; + +/** + *

Some utils for converting from and to any base

+ * + * @author cedric dot walter @ gmail dot com + */ +public class BaseNumberUtils { + + + public static double convertToDecimal(String value, int base, int maxNumberOfPlaces) throws IllegalArgumentException { + if (value.isEmpty()) { + return 0.0; + } + + long stringLength = value.length(); + if (stringLength > maxNumberOfPlaces) { + throw new IllegalArgumentException(); + } + + double decimalValue = 0.0; + + long signedDigit = 0; + boolean hasSignedDigit = true; + char[] characters = value.toCharArray(); + for (char character : characters) { + long digit; + + if ('0' <= character && character <= '9') { + digit = character - '0'; + } else if ('A' <= character && character <= 'Z') { + digit = 10 + (character - 'A'); + } else if ('a' <= character && character <= 'z') { + digit = 10 + (character - 'a'); + } else { + digit = base; + } + + if (digit < base) { + if (hasSignedDigit) { + hasSignedDigit = false; + signedDigit = digit; + } + decimalValue = decimalValue * base + digit; + } else { + throw new IllegalArgumentException("character not allowed"); + } + } + + boolean isNegative = (!hasSignedDigit && stringLength == maxNumberOfPlaces && (signedDigit >= base / 2)); + if (isNegative) { + decimalValue = getTwoComplement(base, maxNumberOfPlaces, decimalValue); + decimalValue = decimalValue * -1.0; + } + + return decimalValue; + } + + private static double getTwoComplement(double base, double maxNumberOfPlaces, double decimalValue) { + return (Math.pow(base, maxNumberOfPlaces) - decimalValue); + } +} diff --git a/src/java/org/apache/poi/ss/formula/functions/Hex2Dec.java b/src/java/org/apache/poi/ss/formula/functions/Hex2Dec.java index 6fdebf52c2..ccd641eaef 100644 --- a/src/java/org/apache/poi/ss/formula/functions/Hex2Dec.java +++ b/src/java/org/apache/poi/ss/formula/functions/Hex2Dec.java @@ -20,8 +20,6 @@ package org.apache.poi.ss.formula.functions; import org.apache.poi.ss.formula.OperationEvaluationContext; import org.apache.poi.ss.formula.eval.*; -import java.math.BigInteger; - /** * Implementation for Excel HEX2DEC() function.

*

@@ -41,53 +39,16 @@ public class Hex2Dec extends Fixed1ArgFunction implements FreeRefFunction { public static final FreeRefFunction instance = new Hex2Dec(); + static final int HEXADECIMAL_BASE = 16; + static final int MAX_NUMBER_OF_PLACES = 10; + public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval numberVE) { - String number = OperandResolver.coerceValueToString(numberVE); - if (number.length() > 10) { + String hex = OperandResolver.coerceValueToString(numberVE); + try { + return new NumberEval(BaseNumberUtils.convertToDecimal(hex, HEXADECIMAL_BASE, MAX_NUMBER_OF_PLACES)); + } catch (IllegalArgumentException e) { return ErrorEval.NUM_ERROR; } - - String unsigned; - boolean isPositive = false; - boolean isNegative = false; - if (number.length() < 10) { - unsigned = number; - isPositive = true; - } else { - //remove sign bit - unsigned = number.substring(1); - isNegative = - number.startsWith("8") || number.startsWith("9") || - number.startsWith("A") || number.startsWith("B") || - number.startsWith("C") || number.startsWith("D") || - number.startsWith("E") || number.startsWith("F"); - } - - long decimal; - if (isPositive) { - try { - decimal = Integer.parseInt(unsigned, 16); - } catch (NumberFormatException ee) { - // number is not a valid hexadecimal number - return ErrorEval.NUM_ERROR; - } - } else { - if (isNegative) { - BigInteger temp = new BigInteger(unsigned, 16); - BigInteger subtract = BigInteger.ONE.shiftLeft(unsigned.length() * 4); - temp = temp.subtract(subtract); - decimal = temp.longValue(); - } else { - try { - decimal = Integer.parseInt(unsigned, 16); - } catch (NumberFormatException ee) { - // number is not a valid hexadecimal number - return ErrorEval.NUM_ERROR; - } - } - } - - return new NumberEval(decimal); } public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) { diff --git a/src/java/org/apache/poi/ss/formula/functions/Oct2Dec.java b/src/java/org/apache/poi/ss/formula/functions/Oct2Dec.java new file mode 100644 index 0000000000..db9447df57 --- /dev/null +++ b/src/java/org/apache/poi/ss/formula/functions/Oct2Dec.java @@ -0,0 +1,64 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.ss.formula.functions; + +import org.apache.poi.ss.formula.OperationEvaluationContext; +import org.apache.poi.ss.formula.eval.ErrorEval; +import org.apache.poi.ss.formula.eval.NumberEval; +import org.apache.poi.ss.formula.eval.OperandResolver; +import org.apache.poi.ss.formula.eval.ValueEval; + +/** + *

Implementation for Excel Oct2Dec() function.

+ *

+ * Converts an octal number to decimal. + *

+ *

+ * Syntax:
Oct2Dec (number ) + *

+ *

+ * Number is the octal number you want to convert. Number may not contain more than 10 octal characters (30 bits). + * The most significant bit of number is the sign bit. The remaining 29 bits are magnitude bits. + * Negative numbers are represented using two's-complement notation.. + *

+ * If number is not a valid octal number, OCT2DEC returns the #NUM! error value. + * + * @author cedric dot walter @ gmail dot com + */ +public class Oct2Dec extends Fixed1ArgFunction implements FreeRefFunction { + + public static final FreeRefFunction instance = new Oct2Dec(); + + static final int MAX_NUMBER_OF_PLACES = 10; + static final int OCTAL_BASE = 8; + + public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval numberVE) { + String octal = OperandResolver.coerceValueToString(numberVE); + try { + return new NumberEval(BaseNumberUtils.convertToDecimal(octal, OCTAL_BASE, MAX_NUMBER_OF_PLACES)); + } catch (IllegalArgumentException e) { + return ErrorEval.NUM_ERROR; + } + } + + public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) { + if (args.length != 1) { + return ErrorEval.VALUE_INVALID; + } + return evaluate(ec.getRowIndex(), ec.getColumnIndex(), args[0]); + } +} diff --git a/src/testcases/org/apache/poi/ss/formula/functions/TestHex2Dec.java b/src/testcases/org/apache/poi/ss/formula/functions/TestHex2Dec.java new file mode 100644 index 0000000000..7c04157416 --- /dev/null +++ b/src/testcases/org/apache/poi/ss/formula/functions/TestHex2Dec.java @@ -0,0 +1,60 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.ss.formula.functions; + +import junit.framework.TestCase; +import org.apache.poi.ss.formula.eval.ErrorEval; +import org.apache.poi.ss.formula.eval.NumberEval; +import org.apache.poi.ss.formula.eval.StringEval; +import org.apache.poi.ss.formula.eval.ValueEval; + +/** + * Tests for {@link Hex2Dec} + * + * @author cedric dot walter @ gmail dot com + */ +public final class TestHex2Dec extends TestCase { + + private static ValueEval invokeValue(String number1) { + ValueEval[] args = new ValueEval[] { new StringEval(number1) }; + return new Hex2Dec().evaluate(args, -1, -1); + } + + private static void confirmValue(String msg, String number1, String expected) { + ValueEval result = invokeValue(number1); + assertEquals(NumberEval.class, result.getClass()); + assertEquals(msg, expected, ((NumberEval) result).getStringValue()); + } + + private static void confirmValueError(String msg, String number1, ErrorEval numError) { + ValueEval result = invokeValue(number1); + assertEquals(ErrorEval.class, result.getClass()); + assertEquals(msg, numError, result); + } + + public void testBasic() { + confirmValue("Converts octal 'A5' to decimal (165)", "A5", "165"); + confirmValue("Converts octal FFFFFFFF5B to decimal (-165)", "FFFFFFFF5B", "-165"); + confirmValue("Converts octal 3DA408B9 to decimal (-165)", "3DA408B9", "1034160313"); + } + + public void testErrors() { + confirmValueError("not a valid octal number","GGGGGGG", ErrorEval.NUM_ERROR); + confirmValueError("not a valid octal number","3.14159", ErrorEval.NUM_ERROR); + } +} diff --git a/src/testcases/org/apache/poi/ss/formula/functions/TestOct2Dec.java b/src/testcases/org/apache/poi/ss/formula/functions/TestOct2Dec.java new file mode 100644 index 0000000000..7599ec93f3 --- /dev/null +++ b/src/testcases/org/apache/poi/ss/formula/functions/TestOct2Dec.java @@ -0,0 +1,63 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.ss.formula.functions; + +import junit.framework.TestCase; +import org.apache.poi.ss.formula.eval.ErrorEval; +import org.apache.poi.ss.formula.eval.NumberEval; +import org.apache.poi.ss.formula.eval.StringEval; +import org.apache.poi.ss.formula.eval.ValueEval; + +/** + * Tests for {@link org.apache.poi.ss.formula.functions.Oct2Dec} + * + * @author cedric dot walter @ gmail dot com + */ +public final class TestOct2Dec extends TestCase { + + private static ValueEval invokeValue(String number1) { + ValueEval[] args = new ValueEval[] { new StringEval(number1) }; + return new Oct2Dec().evaluate(args, -1, -1); + } + + private static void confirmValue(String msg, String number1, String expected) { + ValueEval result = invokeValue(number1); + assertEquals(NumberEval.class, result.getClass()); + assertEquals(msg, expected, ((NumberEval) result).getStringValue()); + } + + private static void confirmValueError(String msg, String number1, ErrorEval numError) { + ValueEval result = invokeValue(number1); + assertEquals(ErrorEval.class, result.getClass()); + assertEquals(msg, numError, result); + } + + public void testBasic() { + confirmValue("Converts octal '' to decimal (0)", "", "0"); + confirmValue("Converts octal 54 to decimal (44)", "54", "44"); + confirmValue("Converts octal 7777777533 to decimal (-165)", "7777777533", "-165"); + confirmValue("Converts octal 7000000000 to decimal (-134217728)", "7000000000", "-134217728"); + confirmValue("Converts octal 7776667533 to decimal (-299173)", "7776667533", "-299173"); + } + + public void testErrors() { + confirmValueError("not a valid octal number","ABCDEFGH", ErrorEval.NUM_ERROR); + confirmValueError("not a valid octal number","99999999", ErrorEval.NUM_ERROR); + confirmValueError("not a valid octal number","3.14159", ErrorEval.NUM_ERROR); + } +} diff --git a/test-data/spreadsheet/FormulaEvalTestData.xls b/test-data/spreadsheet/FormulaEvalTestData.xls index 4245acb88ddeacc231355438a00267c45ba9f3f7..f06572b62525ff42cb865aff489bf25f6ee4b5de 100644 GIT binary patch delta 28674 zcmaKV31C!35_b2SGv_1_NF*Tvl0YB6KmkG56;ap@G6GIoAV`NgOy)!lO#FI~O zmWG7pxUQ2P&Zy3Mk~4H#`-7_{HMAtNG_<1a+0c8LDb72W5A0R@MP}c2@?fYtP5Xd}8n|GpEd~x^eg|e=5Im?!386L@V(~acFc=s`1^p(5*!`I7XI~hm!pLLPv^H z(^{hly<)}SKuLM&$Z^HP2N@zGHS}gtcIcO)4xuUjjo!m9AwG2q5t=eSrM4j8Y$vm7 zdrWEFCg>4jWYxT$r8ibJimx59qI-WK;vsDl(npbY9RSHvhxmb4c$=6QX6g z5NDBwkj}mg?ivTHAiWpqb!~*Wfb=NRTgD49I31snZb3S>LWp2th7b+-upVj21PE^n z3m|a4icGiy>HSDkuM^@Yq^pq5$r8d@Da02@mmq~Zg>xbrfpiH{KVrpwy%0N* zK7_Ocv66a&5Fa63g>)2RBx@4<|0zB^ISJYzI8rAAfb?;s*C0r|Q-s)sbP>|45E~bf zZbN#72kZb!Os257{@MWox1&bbXe3Ni5o($z@E2WJYAjG#D-bQ#jCXQ4YG zCTfw+M4CGr(T?;rq&Firif@N-q#D#dpzWtqr*MvC<3rTF{HQXJSI#naoQsH&IZ!QE0M?vvu# zBU1GKREoo=rD**>Dc*4y;)u@>Wi1WyQl=rYIvS!|S3|ttRh_-wn5}-l+UQo>=l%;$ z>8_wD{#bPvqS5s1yi7^%x`uw5( zy&e=5px=T-m+**(@ZZBC#ze=82gL-=O+;=S=ORBe{Nc`*-A@Az%C$gFidY!=FZ9^M zo#c|*Z4a-Ia!F|D(re`W+9#Gy15x|OBbd0Bgx-DZ8kt|4vaBcZhAijg?iIr*Yxm#b@weuQk+LTA;}iGe^Bw9n{LOxH zhI}Bj{K@U$4|}SMoEw_=RH3Y>{o7L?IAlX;?z16TQ|o!|rdVh+bNwReC~Uht^wUfI z9o1PYLp@(Ea_r4qSv&9LJOlIOv#;jJ^xC&y{Z-1!+BY{WGvxHz;hO^

*eY$Z2FO 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 delta 28392 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 -- 2.39.5