From ec930fd66aa22cb039b5cca52b0d297fe7208889 Mon Sep 17 00:00:00 2001 From: Yegor Kozlov Date: Sat, 2 Mar 2013 13:17:53 +0000 Subject: [PATCH] Bugzilla 54469 - Support for financial functions IPMT and PPMT git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1451886 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/ss/formula/eval/FunctionEval.java | 2 + .../poi/ss/formula/functions/Finance.java | 155 ++++++++++++++++++ .../apache/poi/ss/formula/functions/IPMT.java | 56 +++++++ .../apache/poi/ss/formula/functions/PPMT.java | 60 +++++++ .../poi/ss/formula/functions/TestIPMT.java | 57 +++++++ .../poi/ss/formula/functions/TestPPMT.java | 54 ++++++ test-data/spreadsheet/FormulaEvalTestData.xls | Bin 167424 -> 176640 bytes test-data/spreadsheet/finance.xls | Bin 0 -> 43008 bytes 8 files changed, 384 insertions(+) create mode 100644 src/java/org/apache/poi/ss/formula/functions/Finance.java create mode 100644 src/java/org/apache/poi/ss/formula/functions/IPMT.java create mode 100644 src/java/org/apache/poi/ss/formula/functions/PPMT.java create mode 100644 src/testcases/org/apache/poi/ss/formula/functions/TestIPMT.java create mode 100644 src/testcases/org/apache/poi/ss/formula/functions/TestPPMT.java create mode 100644 test-data/spreadsheet/finance.xls diff --git a/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java b/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java index 733b14b26b..1bae7ed2da 100644 --- a/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java +++ b/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java @@ -161,6 +161,8 @@ public final class FunctionEval { retval[ID.INDIRECT] = null; // Indirect.evaluate has different signature retval[162] = TextFunction.CLEAN; //Aniket Banerjee + retval[167] = new IPMT(); + retval[168] = new PPMT(); retval[169] = new Counta(); retval[183] = AggregateFunction.PRODUCT; diff --git a/src/java/org/apache/poi/ss/formula/functions/Finance.java b/src/java/org/apache/poi/ss/formula/functions/Finance.java new file mode 100644 index 0000000000..4058419125 --- /dev/null +++ b/src/java/org/apache/poi/ss/formula/functions/Finance.java @@ -0,0 +1,155 @@ +package org.apache.poi.ss.formula.functions; + + +/** + * Implementation of the financial functions pmt, fv, ppmt, ipmt. + * + * @author Mike Argyriou micharg@gmail.com + */ +public class Finance { + + /** + * Emulates Excel/Calc's PMT(interest_rate, number_payments, PV, FV, Type) + * function, which calculates the payments for a loan or the future value of an investment + * + * @param r + * - periodic interest rate represented as a decimal. + * @param nper + * - number of total payments / periods. + * @param pv + * - present value -- borrowed or invested principal. + * @param fv + * - future value of loan or annuity. + * @param type + * - when payment is made: beginning of period is 1; end, 0. + * @return double representing periodic payment amount. + */ + // http://arachnoid.com/lutusp/finance.html + static public double pmt(double r, int nper, double pv, double fv, int type) { + double pmt = -r * (pv * Math.pow(1 + r, nper) + fv) / ((1 + r*type) * (Math.pow(1 + r, nper) - 1)); + return pmt; + } + + + /** + * Overloaded pmt() call omitting type, which defaults to 0. + * + * @see #pmt(double, int, double, double, int) + */ + static public double pmt(double r, int nper, double pv, double fv) { + return pmt(r, nper, pv, fv, 0); + } + + /** + * Overloaded pmt() call omitting fv and type, which both default to 0. + * + * @see #pmt(double, int, double, double, int) + */ + static public double pmt(double r, int nper, double pv) { + return pmt(r, nper, pv, 0); + } + + + /** + * Emulates Excel/Calc's IPMT(interest_rate, period, number_payments, PV, + * FV, Type) function, which calculates the portion of the payment at a + * given period that is the interest on previous balance. + * + * @param r + * - periodic interest rate represented as a decimal. + * @param per + * - period (payment number) to check value at. + * @param nper + * - number of total payments / periods. + * @param pv + * - present value -- borrowed or invested principal. + * @param fv + * - future value of loan or annuity. + * @param type + * - when payment is made: beginning of period is 1; end, 0. + * @return double representing interest portion of payment. + * + * @see #pmt(double, int, double, double, int) + * @see #fv(double, int, double, double, int) + */ + // http://doc.optadata.com/en/dokumentation/application/expression/functions/financial.html + static public double ipmt(double r, int per, int nper, double pv, double fv, int type) { + double ipmt = fv(r, per - 1, pmt(r, nper, pv, fv, type), pv, type) * r; + if (type==1) ipmt /= (1 + r); + return ipmt; + } + + static public double ipmt(double r, int per, int nper, double pv, double fv) { + return ipmt(r, per, nper, pv, fv, 0); + } + + static public double ipmt(double r, int per, int nper, double pv) { + return ipmt(r, per, nper, pv, 0); + } + + /** + * Emulates Excel/Calc's PPMT(interest_rate, period, number_payments, PV, + * FV, Type) function, which calculates the portion of the payment at a + * given period that will apply to principal. + * + * @param r + * - periodic interest rate represented as a decimal. + * @param per + * - period (payment number) to check value at. + * @param nper + * - number of total payments / periods. + * @param pv + * - present value -- borrowed or invested principal. + * @param fv + * - future value of loan or annuity. + * @param type + * - when payment is made: beginning of period is 1; end, 0. + * @return double representing principal portion of payment. + * + * @see #pmt(double, int, double, double, int) + * @see #ipmt(double, int, int, double, double, boolean) + */ + static public double ppmt(double r, int per, int nper, double pv, double fv, int type) { + return pmt(r, nper, pv, fv, type) - ipmt(r, per, nper, pv, fv, type); + } + + static public double ppmt(double r, int per, int nper, double pv, double fv) { + return pmt(r, nper, pv, fv) - ipmt(r, per, nper, pv, fv); + } + + static public double ppmt(double r, int per, int nper, double pv) { + return pmt(r, nper, pv) - ipmt(r, per, nper, pv); + } + + /** + * Emulates Excel/Calc's FV(interest_rate, number_payments, payment, PV, + * Type) function, which calculates future value or principal at period N. + * + * @param r + * - periodic interest rate represented as a decimal. + * @param nper + * - number of total payments / periods. + * @param pmt + * - periodic payment amount. + * @param pv + * - present value -- borrowed or invested principal. + * @param type + * - when payment is made: beginning of period is 1; end, 0. + * @return double representing future principal value. + */ + //http://en.wikipedia.org/wiki/Future_value + static public double fv(double r, int nper, double pmt, double pv, int type) { + double fv = -(pv * Math.pow(1 + r, nper) + pmt * (1+r*type) * (Math.pow(1 + r, nper) - 1) / r); + return fv; + } + + /** + * Overloaded fv() call omitting type, which defaults to 0. + * + * @see #fv(double, int, double, double, int) + */ + static public double fv(double r, int nper, double c, double pv) { + return fv(r, nper, c, pv, 0); + } +} + diff --git a/src/java/org/apache/poi/ss/formula/functions/IPMT.java b/src/java/org/apache/poi/ss/formula/functions/IPMT.java new file mode 100644 index 0000000000..35dca8a2f6 --- /dev/null +++ b/src/java/org/apache/poi/ss/formula/functions/IPMT.java @@ -0,0 +1,56 @@ +/* + * ==================================================================== + * 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.eval.ErrorEval; +import org.apache.poi.ss.formula.eval.EvaluationException; +import org.apache.poi.ss.formula.eval.OperandResolver; +import org.apache.poi.ss.formula.eval.ValueEval; + +public class IPMT extends NumericFunction { + + @Override + public double eval(ValueEval[] args, int srcCellRow, int srcCellCol) throws EvaluationException { + + if(args.length != 4) + throw new EvaluationException(ErrorEval.VALUE_INVALID); + + double result; + + ValueEval v1 = OperandResolver.getSingleValue(args[0], srcCellRow, srcCellCol); + ValueEval v2 = OperandResolver.getSingleValue(args[1], srcCellRow, srcCellCol); + ValueEval v3 = OperandResolver.getSingleValue(args[2], srcCellRow, srcCellCol); + ValueEval v4 = OperandResolver.getSingleValue(args[3], srcCellRow, srcCellCol); + + double interestRate = OperandResolver.coerceValueToDouble(v1); + int period = OperandResolver.coerceValueToInt(v2); + int numberPayments = OperandResolver.coerceValueToInt(v3); + double PV = OperandResolver.coerceValueToDouble(v4); + + result = Finance.ipmt(interestRate, period, numberPayments, PV) ; + + checkValue(result); + + return result; + } + + + +} diff --git a/src/java/org/apache/poi/ss/formula/functions/PPMT.java b/src/java/org/apache/poi/ss/formula/functions/PPMT.java new file mode 100644 index 0000000000..68b8683323 --- /dev/null +++ b/src/java/org/apache/poi/ss/formula/functions/PPMT.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 org.apache.poi.ss.formula.*; +import org.apache.poi.ss.formula.functions.*; +import org.apache.poi.ss.formula.eval.*; + +/** + * Compute the interest portion of a payment. + * + * @author Mike Argyriou micharg@gmail.com + */ +public class PPMT extends NumericFunction { + + @Override + public double eval(ValueEval[] args, int srcCellRow, int srcCellCol) throws EvaluationException { + + if(args.length < 4) + throw new EvaluationException(ErrorEval.VALUE_INVALID); + + double result; + + ValueEval v1 = OperandResolver.getSingleValue(args[0], srcCellRow, srcCellCol); + ValueEval v2 = OperandResolver.getSingleValue(args[1], srcCellRow, srcCellCol); + ValueEval v3 = OperandResolver.getSingleValue(args[2], srcCellRow, srcCellCol); + ValueEval v4 = OperandResolver.getSingleValue(args[3], srcCellRow, srcCellCol); + + double interestRate = OperandResolver.coerceValueToDouble(v1); + int period = OperandResolver.coerceValueToInt(v2); + int numberPayments = OperandResolver.coerceValueToInt(v3); + double PV = OperandResolver.coerceValueToDouble(v4); + + result = Finance.ppmt(interestRate, period, numberPayments, PV) ; + + checkValue(result); + + return result; + } + + + +} diff --git a/src/testcases/org/apache/poi/ss/formula/functions/TestIPMT.java b/src/testcases/org/apache/poi/ss/formula/functions/TestIPMT.java new file mode 100644 index 0000000000..d0c3e3d305 --- /dev/null +++ b/src/testcases/org/apache/poi/ss/formula/functions/TestIPMT.java @@ -0,0 +1,57 @@ +/* + * ==================================================================== + * 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.AssertionFailedError; +import junit.framework.TestCase; +import org.apache.poi.hssf.HSSFTestDataSamples; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.formula.OperationEvaluationContext; +import org.apache.poi.ss.formula.eval.*; + +/** + * Test cases for IPMT() + * + */ +public final class TestIPMT extends TestCase { + + + /** + * from http://office.microsoft.com/en-001/excel-help/ipmt-HP005209145.aspx + */ + public void testFromFile() { + + HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("finance.xls"); + HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb); + + HSSFSheet example1 = wb.getSheet("IPMT"); + HSSFCell ex1cell1 = example1.getRow(6).getCell(0); + fe.evaluate(ex1cell1); + assertEquals(-22.41, ex1cell1.getNumericCellValue(), 0.1); + + HSSFCell ex1cell2 = example1.getRow(7).getCell(0); + fe.evaluate(ex1cell2); + assertEquals(-292.45, ex1cell2.getNumericCellValue(), 0.1); + + } +} diff --git a/src/testcases/org/apache/poi/ss/formula/functions/TestPPMT.java b/src/testcases/org/apache/poi/ss/formula/functions/TestPPMT.java new file mode 100644 index 0000000000..45472f6dc4 --- /dev/null +++ b/src/testcases/org/apache/poi/ss/formula/functions/TestPPMT.java @@ -0,0 +1,54 @@ +/* + * ==================================================================== + * 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.hssf.HSSFTestDataSamples; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; + +/** + * Test cases for PPMT() + * + */ +public final class TestPPMT extends TestCase { + + + /** + * http://office.microsoft.com/en-001/excel-help/ppmt-function-HP010342774.aspx + */ + public void testFromFile() { + + HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("finance.xls"); + HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb); + + HSSFSheet example1 = wb.getSheet("PPMT"); + HSSFCell ex1cell1 = example1.getRow(5).getCell(0); + fe.evaluate(ex1cell1); + assertEquals(-75.62, ex1cell1.getNumericCellValue(), 0.1); + + HSSFCell ex1cell2 = example1.getRow(16).getCell(0); + fe.evaluate(ex1cell2); + assertEquals(-27598.05, ex1cell2.getNumericCellValue(), 0.1); + + } +} diff --git a/test-data/spreadsheet/FormulaEvalTestData.xls b/test-data/spreadsheet/FormulaEvalTestData.xls index b8139601efb4a39632a1e12bae955cb4bd9add7f..c585b823ef687f1e4bc9d0e3501e85602b5623b1 100644 GIT binary patch delta 18933 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