Beispiel #1
0
        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));
            }
        }
Beispiel #2
0
 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();
     }
 }
Beispiel #3
0
 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));
 }
Beispiel #4
0
        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());
            }
        }