private void DoFunction(ExecutionItem ei) { Variant v; FunctionDesc fd = new FunctionDesc(ei.itemString); foreach (string s in ei.itemParams) { Parser p = new Parser(); p.ParseIt(s); ExecutionQueue eq; eq = p.eqResult; Calculator c = new Calculator(); fd.Add(c.CalcIt(eq)); } v = EmbeddedFunction(fd); if (v.VarType != VariantType.vtUnknow) { calcStack.Push(v); } else { throw(new CalcException("Bad function " + ei.itemString)); } }
private Variant EmbeddedFunction(FunctionDesc fd) { switch(fd.functionName.ToUpper()) { case "PI": return new Variant(System.Math.PI); case "NOW": return new Variant(System.DateTime.Now); case "SIN": if(fd.Count<1) throw new CalcException("Parameters count too small for SIN function"); return new Variant(System.Math.Sin(fd[0])); case "COS": if(fd.Count<1) throw new CalcException("Parameters count too small for COS function"); return new Variant(System.Math.Cos(fd[0])); case "ABS": if(fd.Count<1) throw new CalcException("Parameters count too small for ABS function"); return new Variant((double)System.Math.Abs((double)fd[0])); case "SQRT": if(fd.Count<1) throw new CalcException("Parameters count too small for SQRT function"); return new Variant(System.Math.Sqrt(fd[0])); case "IIF": if(fd.Count<3) throw new CalcException("Parameters count too small for IIF function"); if((bool)fd[0]) return fd[1]; else return fd[2]; case "FORMAT": if(fd.Count<2) throw new CalcException("Parameters count too small for FORMAT function"); Variant v; v = fd[1]; switch(v.VarType) { case VariantType.vtBool: return new Variant(String.Format("{0:" + fd[0].ToString() + "}",(bool)v)); case VariantType.vtInt: return new Variant(String.Format("{0:" + fd[0].ToString() + "}",(int)v)); case VariantType.vtDouble: return new Variant(String.Format("{0:" + fd[0].ToString() + "}",(double)v)); case VariantType.vtDateTime: return new Variant(String.Format("{0:" + fd[0].ToString() + "}",(DateTime)v)); case VariantType.vtString: return new Variant(String.Format("{0:" + fd[0].ToString() + "}",(string)v)); default: return new Variant(""); } default: return new Variant(); } }
private void DoFunction(ExecutionItem ei) { Variant v; FunctionDesc fd = new FunctionDesc(ei.itemString); foreach(string s in ei.itemParams) { Parser p = new Parser(); p.ParseIt(s); ExecutionQueue eq; eq = p.eqResult; Calculator c = new Calculator(); fd.Add(c.CalcIt(eq)); } v = EmbeddedFunction(fd); if(v.VarType != VariantType.vtUnknow) calcStack.Push(v); else throw(new CalcException("Bad function " + ei.itemString)); }
private Variant EmbeddedFunction(FunctionDesc fd) { switch (fd.functionName.ToUpper()) { case "PI": return(new Variant(System.Math.PI)); case "NOW": return(new Variant(System.DateTime.Now)); case "SIN": if (fd.Count < 1) { throw new CalcException("Parameters count too small for SIN function"); } return(new Variant(System.Math.Sin(fd[0]))); case "COS": if (fd.Count < 1) { throw new CalcException("Parameters count too small for COS function"); } return(new Variant(System.Math.Cos(fd[0]))); case "ABS": if (fd.Count < 1) { throw new CalcException("Parameters count too small for ABS function"); } return(new Variant((double)System.Math.Abs((double)fd[0]))); case "SQRT": if (fd.Count < 1) { throw new CalcException("Parameters count too small for SQRT function"); } return(new Variant(System.Math.Sqrt(fd[0]))); case "IIF": if (fd.Count < 3) { throw new CalcException("Parameters count too small for IIF function"); } if ((bool)fd[0]) { return(fd[1]); } else { return(fd[2]); } case "FORMAT": if (fd.Count < 2) { throw new CalcException("Parameters count too small for FORMAT function"); } Variant v; v = fd[1]; switch (v.VarType) { case VariantType.vtBool: return(new Variant(String.Format("{0:" + fd[0].ToString() + "}", (bool)v))); case VariantType.vtInt: return(new Variant(String.Format("{0:" + fd[0].ToString() + "}", (int)v))); case VariantType.vtDouble: return(new Variant(String.Format("{0:" + fd[0].ToString() + "}", (double)v))); case VariantType.vtDateTime: return(new Variant(String.Format("{0:" + fd[0].ToString() + "}", (DateTime)v))); case VariantType.vtString: return(new Variant(String.Format("{0:" + fd[0].ToString() + "}", (string)v))); default: return(new Variant("")); } default: return(new Variant()); } }