예제 #1
0
        public static object Evaluate(string expression, _7Sharp.AdditionalFunctionEventHandler handler)
        {
            ExpressionEval expressionEval = new ExpressionEval(expression);

            expressionEval.AdditionalFunctionEventHandler += handler;
            return(expressionEval.Evaluate());
        }
예제 #2
0
        private object ExecuteFunction(string name, object[] p)
        {
            object[] parameters = (object[])null;
            if (p != null)
            {
                parameters = (object[])p.Clone();
                for (int index = 0; index < parameters.Length; ++index)
                {
                    if (parameters[index] is IExpression)
                    {
                        parameters[index] = ((IExpression)parameters[index]).Evaluate();
                    }
                }
            }
            switch (name.ToLower(CultureInfo.CurrentCulture))
            {
            case "abs":
                return((object)Math.Abs(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)));

            case "acos":
                return((object)Math.Acos(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)));

            case "adddays":
                return((object)Convert.ToDateTime(parameters[0]).AddDays((double)Convert.ToInt32(parameters[1])));

            case "addhours":
                return((object)Convert.ToDateTime(parameters[0]).AddHours((double)Convert.ToInt32(parameters[1])));

            case "addminutes":
                return((object)Convert.ToDateTime(parameters[0]).AddMinutes((double)Convert.ToInt32(parameters[1])));

            case "addmonths":
                return((object)Convert.ToDateTime(parameters[0]).AddMonths(Convert.ToInt32(parameters[1])));

            case "addseconds":
                return((object)Convert.ToDateTime(parameters[0]).AddSeconds((double)Convert.ToInt32(parameters[1])));

            case "addyears":
                return((object)Convert.ToDateTime(parameters[0]).AddYears(Convert.ToInt32(parameters[1])));

            case "asin":
                return((object)Math.Asin(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)));

            case "atan":
                return((object)Math.Atan(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)));

            case "case":
                return(FunctionEval.Case(parameters));

            case "cdatetime":
                return((object)Convert.ToDateTime(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture));

            case "cdbl":
                return((object)Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture));

            case "ciel":
                return((object)Math.Ceiling(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)));

            case "cint":
                return((object)Convert.ToInt32(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture));

            case "clong":
                return((object)Convert.ToInt64(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture));

            case "cos":
                return((object)Math.Cos(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)));

            case "cosh":
                return((object)Math.Cosh(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)));

            case "cot":
                return((object)(1.0 / Math.Tan(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))));

            case "csc":
                return((object)(1.0 / Math.Sin(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))));

            case "cuint":
                return((object)Convert.ToUInt32(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture));

            case "culong":
                return((object)Convert.ToUInt64(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture));

            case "currentuserid":
                return((object)WindowsIdentity.GetCurrent().Name.ToLower());

            case "e":
                return((object)Math.E);

            case "exp":
                return((object)Math.Exp(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)));

            case "expr":
                ExpressionEval expressionEval = new ExpressionEval(string.Concat(parameters[0]));
                // ISSUE: reference to a compiler-generated field
                expressionEval.AdditionalFunctionEventHandler += this.AdditionalFunctionEventHandler;
                expressionEval._variables = this._variables;
                return(expressionEval.Evaluate());

            case "floor":
                return((object)Math.Floor(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)));

            case "fmtdate":
                return((object)Convert.ToDateTime(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture).ToString(string.Concat(parameters[1]), (IFormatProvider)CultureInfo.CurrentCulture));

            case "fmtnum":
                return((object)Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture).ToString(string.Concat(parameters[1]), (IFormatProvider)CultureInfo.CurrentCulture));

            case "iif":
                return(FunctionEval.Iif(parameters));

            case "log":
                return((object)(parameters.Length > 1 ? Math.Log(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture), Convert.ToDouble(parameters[1], (IFormatProvider)CultureInfo.CurrentCulture)) : Math.Log(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))));

            case "log10":
                return((object)Math.Log10(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)));

            case "max":
                return((object)Math.Max(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture), Convert.ToDouble(parameters[1], (IFormatProvider)CultureInfo.CurrentCulture)));

            case "maxdate":
                return((object)DateTime.MaxValue);

            case "min":
                return((object)Math.Min(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture), Convert.ToDouble(parameters[1], (IFormatProvider)CultureInfo.CurrentCulture)));

            case "mindate":
                return((object)DateTime.MinValue);

            case "monthname":
                return((object)new DateTime(2000, Convert.ToInt32(parameters[0]), 1).ToString("MMMM"));

            case "now":
                return((object)DateTime.Now);

            case "pi":
                return((object)Math.PI);

            case "pow":
                return((object)Math.Pow(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture), Convert.ToDouble(parameters[1], (IFormatProvider)CultureInfo.CurrentCulture)));

            case "round":
                return((object)(parameters.Length > 1 ? Math.Round(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture), Convert.ToInt32(parameters[1], (IFormatProvider)CultureInfo.CurrentCulture)) : Math.Round(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))));

            case "sec":
                return((object)(1.0 / Math.Cos(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))));

            case "sin":
                return((object)Math.Sin(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)));

            case "sinh":
                return((object)Math.Sinh(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)));

            case "sqrt":
                return((object)Math.Sqrt(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)));

            case "str":
                return((object)parameters[0].ToString());

            case "tan":
                return((object)Math.Tan(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)));

            case "tanh":
                return((object)Math.Tanh(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)));

            case "today":
                return((object)DateTime.Today);

            default:
                return(this.AdditionalFunctionHelper(name, parameters));
            }
        }