/*
|
* 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.
|
*/
|
|
namespace HH.WMS.Utils.NPOI.SS.Formula.Functions
|
{
|
using System;
|
using HH.WMS.Utils.NPOI.SS.Formula.Eval;
|
|
|
/**
|
* @author Amol S. Deshmukh < amolweb at ya hoo dot com >
|
* Super class for all Evals for financial function evaluation.
|
*
|
*/
|
public abstract class FinanceFunction : Function3Arg, Function4Arg
|
{
|
private static ValueEval DEFAULT_ARG3 = NumberEval.ZERO;
|
private static ValueEval DEFAULT_ARG4 = BoolEval.FALSE;
|
|
protected FinanceFunction()
|
{
|
|
}
|
public ValueEval Evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1,
|
ValueEval arg2)
|
{
|
return Evaluate(srcRowIndex, srcColumnIndex, arg0, arg1, arg2, DEFAULT_ARG3);
|
}
|
public ValueEval Evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1,
|
ValueEval arg2, ValueEval arg3)
|
{
|
return Evaluate(srcRowIndex, srcColumnIndex, arg0, arg1, arg2, arg3, DEFAULT_ARG4);
|
}
|
public ValueEval Evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1,
|
ValueEval arg2, ValueEval arg3, ValueEval arg4)
|
{
|
double result;
|
try
|
{
|
double d0 = NumericFunction.SingleOperandEvaluate(arg0, srcRowIndex, srcColumnIndex);
|
double d1 = NumericFunction.SingleOperandEvaluate(arg1, srcRowIndex, srcColumnIndex);
|
double d2 = NumericFunction.SingleOperandEvaluate(arg2, srcRowIndex, srcColumnIndex);
|
double d3 = NumericFunction.SingleOperandEvaluate(arg3, srcRowIndex, srcColumnIndex);
|
double d4 = NumericFunction.SingleOperandEvaluate(arg4, srcRowIndex, srcColumnIndex);
|
result = Evaluate(d0, d1, d2, d3, d4 != 0.0);
|
NumericFunction.CheckValue(result);
|
}
|
catch (EvaluationException e)
|
{
|
return e.GetErrorEval();
|
}
|
return new NumberEval(result);
|
}
|
public ValueEval Evaluate(ValueEval[] args, int srcRowIndex, int srcColumnIndex)
|
{
|
switch (args.Length)
|
{
|
case 3:
|
return Evaluate(srcRowIndex, srcColumnIndex, args[0], args[1], args[2], DEFAULT_ARG3, DEFAULT_ARG4);
|
case 4:
|
return Evaluate(srcRowIndex, srcColumnIndex, args[0], args[1], args[2], args[3], DEFAULT_ARG4);
|
case 5:
|
return Evaluate(srcRowIndex, srcColumnIndex, args[0], args[1], args[2], args[3], args[4]);
|
}
|
return ErrorEval.VALUE_INVALID;
|
}
|
|
public double Evaluate(double[] ds)
|
{
|
// All finance functions have 3 to 5 args, first 4 are numbers, last is boolean
|
// default for last 2 args are 0.0 and false
|
// Text boolean literals are not valid for the last arg
|
|
double arg3 = 0.0;
|
double arg4 = 0.0;
|
|
switch (ds.Length)
|
{
|
case 5:
|
arg4 = ds[4];
|
break;
|
case 4:
|
arg3 = ds[3];
|
break;
|
case 3:
|
break;
|
default:
|
throw new ArgumentException("Wrong number of arguments");
|
}
|
return Evaluate(ds[0], ds[1], ds[2], arg3, arg4 != 0.0);
|
}
|
|
public abstract double Evaluate(double rate, double arg1, double arg2, double arg3, bool type);
|
|
public static Function FV = new Fv();
|
public static Function NPER = new Nper();
|
public static Function PMT = new Pmt();
|
public static Function PV = new Pv();
|
}
|
}
|