]> source.dussan.org Git - poi.git/commitdiff
Implemented this finance function evaluation
authorAmol S. Deshmukh <amol@apache.org>
Wed, 22 Jun 2005 20:43:30 +0000 (20:43 +0000)
committerAmol S. Deshmukh <amol@apache.org>
Wed, 22 Jun 2005 20:43:30 +0000 (20:43 +0000)
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353723 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hssf/record/formula/functions/Fv.java
src/scratchpad/src/org/apache/poi/hssf/record/formula/functions/Nper.java
src/scratchpad/src/org/apache/poi/hssf/record/formula/functions/Pmt.java
src/scratchpad/src/org/apache/poi/hssf/record/formula/functions/Pv.java

index d0ef4ab157541a4bf8232ad738abfba17596a2f9..fa88a3bbb39a46e68d6eb3508c36894aa4edcbfe 100644 (file)
@@ -4,10 +4,60 @@
  */
 package org.apache.poi.hssf.record.formula.functions;
 
+import org.apache.poi.hssf.record.formula.eval.BoolEval;
+import org.apache.poi.hssf.record.formula.eval.ErrorEval;
+import org.apache.poi.hssf.record.formula.eval.Eval;
+import org.apache.poi.hssf.record.formula.eval.NumberEval;
+import org.apache.poi.hssf.record.formula.eval.NumericValueEval;
+import org.apache.poi.hssf.record.formula.eval.ValueEval;
+
 /**
  * @author 
  *
  */
-public class Fv extends DefaultFunctionImpl {
+public class Fv extends FinanceFunction {
+
+    public Eval evaluate(Eval[] operands, int srcRow, short srcCol) {
+        double rate = 0, nper = 0, pmt = 0, pv = 0, d = 0;
+        boolean type = false;
+        ValueEval retval = null;
+        ValueEval ve = null;
+        
+        switch (operands.length) {
+        default:
+            retval = ErrorEval.VALUE_INVALID;
+            break;
+        case 5:
+            ve = singleOperandNumericAsBoolean(operands[4], srcRow, srcCol);
+            if (ve instanceof ErrorEval) { retval = ErrorEval.VALUE_INVALID; break; }
+            type = ((BoolEval) ve).getBooleanValue();
+        case 4:
+            ve = singleOperandEvaluate(operands[3], srcRow, srcCol);
+            if (ve instanceof NumericValueEval) pv   = ((NumericValueEval) ve).getNumberValue();
+            else { retval = ErrorEval.VALUE_INVALID; break; }
+        case 3:
+            ve = singleOperandEvaluate(operands[1], srcRow, srcCol);
+            if (ve instanceof NumericValueEval) nper = ((NumericValueEval) ve).getNumberValue();
+            else { retval = ErrorEval.VALUE_INVALID; break; }
+
+            ve = singleOperandEvaluate(operands[2], srcRow, srcCol);
+            if (ve instanceof NumericValueEval) pmt  = ((NumericValueEval) ve).getNumberValue();
+            else { retval = ErrorEval.VALUE_INVALID; break; }
+
+            ve = singleOperandEvaluate(operands[0], srcRow, srcCol);
+            if (ve instanceof NumericValueEval) rate = ((NumericValueEval) ve).getNumberValue();
+            else { retval = ErrorEval.VALUE_INVALID; break; }
+        }
+        
+        if (retval == null) {
+            d = FinanceLib.fv(rate, nper, pmt, pv, type);
+            retval = (Double.isNaN(d))
+                    ? (ValueEval) ErrorEval.VALUE_INVALID
+                    : (Double.isInfinite(d)) 
+                        ? (ValueEval) ErrorEval.NUM_ERROR 
+                        : new NumberEval(d);
+        }
+        return retval;
+    }
 
 }
index 709e493c08513e6f46007ec79fb531b72b703336..e12bfdbe8c91e4788db6474d9d3577065c3bf950 100644 (file)
@@ -4,10 +4,60 @@
  */
 package org.apache.poi.hssf.record.formula.functions;
 
+import org.apache.poi.hssf.record.formula.eval.BoolEval;
+import org.apache.poi.hssf.record.formula.eval.ErrorEval;
+import org.apache.poi.hssf.record.formula.eval.Eval;
+import org.apache.poi.hssf.record.formula.eval.NumberEval;
+import org.apache.poi.hssf.record.formula.eval.NumericValueEval;
+import org.apache.poi.hssf.record.formula.eval.ValueEval;
+
 /**
  * @author 
  *
  */
-public class Nper extends DefaultFunctionImpl {
+public class Nper extends FinanceFunction {
+
+    public Eval evaluate(Eval[] operands, int srcRow, short srcCol) {
+        double rate = 0, fv = 0, pmt = 0, pv = 0, d = 0;
+        boolean type = false;
+        ValueEval retval = null;
+        ValueEval ve = null;
+        
+        switch (operands.length) {
+        default:
+            retval = ErrorEval.VALUE_INVALID;
+            break;
+        case 5:
+            ve = singleOperandNumericAsBoolean(operands[4], srcRow, srcCol);
+            if (ve instanceof ErrorEval) { retval = ErrorEval.VALUE_INVALID; break; }
+            type = ((BoolEval) ve).getBooleanValue();
+        case 4:
+            ve = singleOperandEvaluate(operands[0], srcRow, srcCol);
+            if (ve instanceof NumericValueEval) rate = ((NumericValueEval) ve).getNumberValue();
+            else { retval = ErrorEval.VALUE_INVALID; break; }
+            
+            ve = singleOperandEvaluate(operands[1], srcRow, srcCol);
+            if (ve instanceof NumericValueEval) pmt  = ((NumericValueEval) ve).getNumberValue();
+            else { retval = ErrorEval.VALUE_INVALID; break; }
+            
+            ve = singleOperandEvaluate(operands[2], srcRow, srcCol);
+            if (ve instanceof NumericValueEval) pv   = ((NumericValueEval) ve).getNumberValue();
+            else { retval = ErrorEval.VALUE_INVALID; break; }
+            
+            ve = singleOperandEvaluate(operands[3], srcRow, srcCol);
+            if (ve instanceof NumericValueEval) fv = ((NumericValueEval) ve).getNumberValue();
+            else { retval = ErrorEval.VALUE_INVALID; break; }
+        }
+        
+        if (retval == null) {
+            d = FinanceLib.nper(rate, pmt, pv, fv, type);
+            retval = (Double.isNaN(d))
+                    ? (ValueEval) ErrorEval.VALUE_INVALID
+                    : (Double.isInfinite(d)) 
+                        ? (ValueEval) ErrorEval.NUM_ERROR 
+                        : new NumberEval(d);
+        }
+        return retval;
+    }
 
 }
index bde301a20af266f0f694fd2c3848029ff478ac99..8e7b9c4e1f5dedb009fb96124c7acf35a37a075c 100644 (file)
@@ -4,10 +4,59 @@
  */
 package org.apache.poi.hssf.record.formula.functions;
 
+import org.apache.poi.hssf.record.formula.eval.BoolEval;
+import org.apache.poi.hssf.record.formula.eval.ErrorEval;
+import org.apache.poi.hssf.record.formula.eval.Eval;
+import org.apache.poi.hssf.record.formula.eval.NumberEval;
+import org.apache.poi.hssf.record.formula.eval.NumericValueEval;
+import org.apache.poi.hssf.record.formula.eval.ValueEval;
+
 /**
  * @author 
  *
  */
-public class Pmt extends DefaultFunctionImpl {
+public class Pmt extends FinanceFunction {
 
+    public Eval evaluate(Eval[] operands, int srcRow, short srcCol) {
+        double rate = 0, fv = 0, nper = 0, pv = 0, d = 0;
+        boolean type = false;
+        ValueEval retval = null;
+        ValueEval ve = null;
+        
+        switch (operands.length) {
+        default:
+            retval = ErrorEval.VALUE_INVALID;
+            break;
+        case 5:
+            ve = singleOperandNumericAsBoolean(operands[4], srcRow, srcCol);
+            if (ve instanceof ErrorEval) { retval = ErrorEval.VALUE_INVALID; break; }
+            type = ((BoolEval) ve).getBooleanValue();
+        case 4:
+            ve = singleOperandEvaluate(operands[0], srcRow, srcCol);
+            if (ve instanceof NumericValueEval) rate = ((NumericValueEval) ve).getNumberValue();
+            else { retval = ErrorEval.VALUE_INVALID; break; }
+            
+            ve = singleOperandEvaluate(operands[1], srcRow, srcCol);
+            if (ve instanceof NumericValueEval) nper  = ((NumericValueEval) ve).getNumberValue();
+            else { retval = ErrorEval.VALUE_INVALID; break; }
+            
+            ve = singleOperandEvaluate(operands[2], srcRow, srcCol);
+            if (ve instanceof NumericValueEval) pv   = ((NumericValueEval) ve).getNumberValue();
+            else { retval = ErrorEval.VALUE_INVALID; break; }
+            
+            ve = singleOperandEvaluate(operands[3], srcRow, srcCol);
+            if (ve instanceof NumericValueEval) fv = ((NumericValueEval) ve).getNumberValue();
+            else { retval = ErrorEval.VALUE_INVALID; break; }
+        }
+        
+        if (retval == null) {
+            d = FinanceLib.pmt(rate, nper, pv, fv, type);
+            retval = (Double.isNaN(d))
+                    ? (ValueEval) ErrorEval.VALUE_INVALID
+                    : (Double.isInfinite(d)) 
+                        ? (ValueEval) ErrorEval.NUM_ERROR 
+                        : new NumberEval(d);
+        }
+        return retval;
+    }
 }
index 8ce1e18c4d7d459613bd895daf5580dde9b0bd87..20614b1128c8c1cbc12dc6fa2f2a338d1dda3857 100644 (file)
@@ -4,10 +4,59 @@
  */
 package org.apache.poi.hssf.record.formula.functions;
 
+import org.apache.poi.hssf.record.formula.eval.BoolEval;
+import org.apache.poi.hssf.record.formula.eval.ErrorEval;
+import org.apache.poi.hssf.record.formula.eval.Eval;
+import org.apache.poi.hssf.record.formula.eval.NumberEval;
+import org.apache.poi.hssf.record.formula.eval.NumericValueEval;
+import org.apache.poi.hssf.record.formula.eval.ValueEval;
+
 /**
  * @author 
  *
  */
-public class Pv extends DefaultFunctionImpl {
+public class Pv extends FinanceFunction {
+
+    public Eval evaluate(Eval[] operands, int srcRow, short srcCol) {
+        double rate = 0, fv = 0, nper = 0, pmt = 0, d = 0;
+        boolean type = false;
+        ValueEval retval = null;
+        ValueEval ve = null;
+        
+        switch (operands.length) {
+        default:
+            retval = ErrorEval.VALUE_INVALID;
+            break;
+        case 5:
+            ve = singleOperandNumericAsBoolean(operands[4], srcRow, srcCol);
+            if (ve instanceof ErrorEval) { retval = ErrorEval.VALUE_INVALID; break; }
+            type = ((BoolEval) ve).getBooleanValue();
+        case 4:
+            ve = singleOperandEvaluate(operands[3], srcRow, srcCol);
+            if (ve instanceof NumericValueEval) fv = ((NumericValueEval) ve).getNumberValue();
+            else { retval = ErrorEval.VALUE_INVALID; break; }
+        case 3:
+            ve = singleOperandEvaluate(operands[1], srcRow, srcCol);
+            if (ve instanceof NumericValueEval) nper  = ((NumericValueEval) ve).getNumberValue();
+            else { retval = ErrorEval.VALUE_INVALID; break; }
+            
+            ve = singleOperandEvaluate(operands[2], srcRow, srcCol);
+            if (ve instanceof NumericValueEval) pmt   = ((NumericValueEval) ve).getNumberValue();
+            else { retval = ErrorEval.VALUE_INVALID; break; }
 
+            ve = singleOperandEvaluate(operands[0], srcRow, srcCol);
+            if (ve instanceof NumericValueEval) rate = ((NumericValueEval) ve).getNumberValue();
+            else { retval = ErrorEval.VALUE_INVALID; break; }
+        }
+        
+        if (retval == null) {
+            d = FinanceLib.pv(rate, nper, pmt, fv, type);
+            retval = (Double.isNaN(d))
+                    ? (ValueEval) ErrorEval.VALUE_INVALID
+                    : (Double.isInfinite(d)) 
+                        ? (ValueEval) ErrorEval.NUM_ERROR 
+                        : new NumberEval(d);
+        }
+        return retval;
+    }
 }