ASF Bugzilla – Attachment 30382 Details for
Bug 55055
[PATCH] patch for missing function Bin2Dec
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
patch
BIN2DEC.patch (text/plain), 6.39 KB, created by
Cédric Walter
on 2013-06-03 20:07:17 UTC
(
hide
)
Description:
patch
Filename:
MIME Type:
Creator:
Cédric Walter
Created:
2013-06-03 20:07:17 UTC
Size:
6.39 KB
patch
obsolete
>Index: poi/src/testcases/org/apache/poi/ss/formula/functions/TestBin2DecFunctionsFromSpreadsheet.java >IDEA additional info: >Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP ><+>UTF-8 >=================================================================== >--- poi/src/testcases/org/apache/poi/ss/formula/functions/TestBin2DecFunctionsFromSpreadsheet.java (revision ) >+++ poi/src/testcases/org/apache/poi/ss/formula/functions/TestBin2DecFunctionsFromSpreadsheet.java (revision ) >@@ -0,0 +1,31 @@ >+/* ==================================================================== >+ 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; >+ >+/** >+ * Tests Bin2Dec() as loaded from a test data spreadsheet.<p/> >+ * >+ * @author cedric dot walter @ gmail dot com >+ */ >+public class TestBin2DecFunctionsFromSpreadsheet extends BaseTestFunctionsFromSpreadsheet { >+ >+ @Override >+ protected String getFilename() { >+ return "Bin2DecFunctionTestCaseData.xls"; >+ } >+} >\ No newline at end of file >Index: poi/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java >IDEA additional info: >Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP ><+>UTF-8 >=================================================================== >--- poi/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java (revision 1488867) >+++ poi/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java (revision ) >@@ -69,7 +69,7 @@ > r(m, "BESSELJ", null); > r(m, "BESSELK", null); > r(m, "BESSELY", null); >- r(m, "BIN2DEC", null); >+ r(m, "BIN2DEC", Bin2Dec.instance); > r(m, "BIN2HEX", null); > r(m, "BIN2OCT", null); > r(m, "COMPLEX", Complex.instance); >Index: poi/src/java/org/apache/poi/ss/formula/functions/Bin2Dec.java >IDEA additional info: >Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP ><+>UTF-8 >=================================================================== >--- poi/src/java/org/apache/poi/ss/formula/functions/Bin2Dec.java (revision ) >+++ poi/src/java/org/apache/poi/ss/formula/functions/Bin2Dec.java (revision ) >@@ -0,0 +1,100 @@ >+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.OperandResolver; >+import org.apache.poi.ss.formula.eval.StringEval; >+import org.apache.poi.ss.formula.eval.ValueEval; >+ >+/** >+ * Implementation for Excel Bin2Dec() function.<p/> >+ * <p/> >+ * <b>Syntax</b>:<br/> <b>Bin2Dec </b>(<b>number</b>)<br/> >+ * <p/> >+ * Converts a binary number to decimal. >+ * <p/> >+ * Number is the binary number you want to convert. Number cannot contain more than 10 characters (10 bits). >+ * The most significant bit of number is the sign bit. The remaining 9 bits are magnitude bits. >+ * Negative numbers are represented using two's-complement notation. >+ * <p/> >+ * Remark >+ * If number is not a valid binary number, or if number contains more than 10 characters (10 bits), >+ * BIN2DEC returns the #NUM! error value. >+ * >+ * @author cedric dot walter @ gmail dot com >+ */ >+public class Bin2Dec extends Fixed1ArgFunction implements FreeRefFunction { >+ >+ public static final FreeRefFunction instance = new Bin2Dec(); >+ >+ @Override >+ public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval numberVE) { >+ String number = OperandResolver.coerceValueToString(numberVE); >+ if (number.length() > 10) { >+ return ErrorEval.NUM_ERROR; >+ } >+ >+ String value = ""; >+ int sum = 0; >+ String unsigned = ""; >+ >+ //If the leftmost bit is 0 -- number is positive. >+ boolean isPositive = false; >+ if (number.length() < 10) { >+ unsigned = number; >+ isPositive = true; >+ } else { >+ unsigned = number.substring(1); >+ isPositive = number.startsWith("0"); >+ } >+ >+ if (isPositive) { >+ //bit9*2^8 + bit8*2^7 + bit7*2^6 + bit6*2^5 + bit5*2^4+ bit3*2^2+ bit2*2^1+ bit1*2^0 >+ sum = getDecimalValue(unsigned); >+ value = String.valueOf(sum); >+ } else { >+ //The leftmost bit is 1 -- this is negative number >+ //Inverse bits [1-9] >+ String inverted = toggleBits(unsigned); >+ // Calculate decimal number >+ sum = getDecimalValue(inverted); >+ >+ //Add 1 to obtained number >+ sum++; >+ >+ value = "-" + String.valueOf(sum); >+ } >+ >+ return new StringEval(value); >+ } >+ >+ private int getDecimalValue(String unsigned) { >+ int sum = 0; >+ int numBits = unsigned.length(); >+ int power = numBits - 1; >+ >+ for (int i = 0; i < numBits; i++) { >+ int bit = Integer.parseInt(unsigned.substring(i, i + 1)); >+ int term = (int) (bit * Math.pow(2, power)); >+ sum += term; >+ power--; >+ } >+ return sum; >+ } >+ >+ private static String toggleBits(String s) { >+ long i = Long.parseLong(s, 2); >+ long i2 = i ^ ((1L << s.length()) - 1); >+ String s2 = Long.toBinaryString(i2); >+ while (s2.length() < s.length()) s2 = '0' + s2; >+ return s2; >+ } >+ >+ @Override >+ public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) { >+ if (args.length != 1) { >+ return ErrorEval.VALUE_INVALID; >+ } >+ return evaluate(ec.getRowIndex(), ec.getColumnIndex(), args[0]); >+ } >+}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 55055
: 30382 |
30383