示例#1
0
        public void TestCalcEngineDayDiff()
        {
            string[] maskDate   = { "dd.MM.yyyy", "dd.MM.yyyy", "dd.MM.yyyy HH:mm", "dd.MM.yyyy HH:mm" };
            string[] dateFrom   = { "01.01.2014", "01.01.2014", "10.03.2014 12:00", "15.03.2014 15:00" };
            string[] dateTo     = { "01.01.2014", "10.01.2014", "10.03.2014 14:00", "16.03.2014 09:00" };
            double[] answerDate = { 1, 10, 1, 2 };


            string[] maskInterval   = { "dd.MM.yyyy", "dd.MM.yyyy", "dd.MM.yyyy" };
            string[] interval       = { "01.01.2014", "01.01.2014 - 31.01.2014", "c 02.02.2014 по 10.02.2014" };
            double[] answerInterval = { 1, 31, 9 };

            var engine = new CalcEngine.CalcEngine();

            for (int i = 0; i < dateFrom.Length; i++)
            {
                engine.Variables.Clear();
                engine.Variables.Add("Mask", maskDate[i]);
                engine.Variables.Add("DateFrom", dateFrom[i]);
                engine.Variables.Add("DateTo", dateTo[i]);

                var res = (double)engine.Evaluate("DAYDIFF(DateFrom,DateTo,Mask)");
                res.Should().Be(answerDate[i]);
            }

            for (int i = 0; i < interval.Length; i++)
            {
                engine.Variables.Clear();
                engine.Variables.Add("Mask", maskInterval[i]);
                engine.Variables.Add("Interval", interval[i]);

                var res = (double)engine.Evaluate("DAYDIFF(Interval,Mask)");
                res.Should().Be(answerInterval[i]);
            }
        }
示例#2
0
        public void TestCalcEngineLen()
        {
            var engine = new CalcEngine.CalcEngine();

            engine.Variables.Add("A1", TestString);

            var res = (int)engine.Evaluate("LEN(A1)");

            res.Should().Be(TestString.Length);
        }
示例#3
0
        public void TestCalcEngineLower()
        {
            var engine = new CalcEngine.CalcEngine();

            engine.Variables.Add("A1", TestString);

            var res = (string)engine.Evaluate("LOWER(A1)");

            res.Should().Be(TestString.ToLower());
        }
示例#4
0
        public void TestCalcEngineLeft()
        {
            var engine = new CalcEngine.CalcEngine();

            engine.Variables.Add("A1", TestString);

            var res = (string)engine.Evaluate("LEFT(A1,4)");

            res.Should().Be(TestString.Remove(4));

            res = (string)engine.Evaluate("LEFT(A1)");
            res.Should().Be(TestString.Remove(1));
        }
示例#5
0
        public void TestFormulaForDisplayName()
        {
            var engine = new CalcEngine.CalcEngine();

            engine.Variables.Add("A", 5);
            engine.Variables.Add("B", "Test string");
            engine.Variables.Add("C", "1");

            var res = (string)engine.Evaluate("FORMAT(\"{0} [{1}]\", B, A)");

            res.Should().Be("Test string [5]");

            res = (string)engine.Evaluate("FORMAT(\"{0} [{1}]\", B, IF(A = 5, C, -1*C))");
            res.Should().Be("Test string [1]");
        }
示例#6
0
        private void button1_Click(object sender, EventArgs e)
        {
            var ce  = new CalcEngine.CalcEngine();
            var dct = new CalcDictionary(ce);

            ce.Variables = dct;

            dct["Amount"]     = 12;
            dct["OfferPrice"] = 12.32;
            dct["Item1"]      = "=Amount * OfferPrice";
            dct["Item2"]      = "=Item1 * 0.06";

            // this will print "8.8704"
            // (Amount * OfferPrice) * 0.06 = 12 * 12.32 * 0.06 = 8.8704
            Console.WriteLine(ce.Evaluate("Item2"));
        }
示例#7
0
        public void TestSKUExample()
        {
            var engine = new CalcEngine.CalcEngine();

            engine.DataContext = new SKUTestClass()
            {
                SKUNAME = "test", SKUCOUNT = 1, SKUCLIENT = null
            };

            var res = (string)engine.Evaluate("FORMAT(\"{0}, {1}{2}\",SKUNAME,SKUCOUNT,IF(SKUCLIENT = null, \", *\", \"\"))");

            //engine.Variables.Add("privet", 66);
            //res = (string)engine.Evaluate("FORMAT(\"{0}, {1}{2}{3}\",SKUNAME,SKUCOUNT,IF(SKUCLIENT = null, \", *\", \"\"),privet)");

            res.Should().Be("test, 1, *");
        }
示例#8
0
        public void TestCalcEngineLastDateInInterval()
        {
            string[] mask    = { "dd.MM.yyyy", "dd.MM.yyyy", "dd.MM.yyyy", "dd.MM.yyyy" };
            string[] example = { "10.01.2014", "15.01.2014", "01.01.2014 - 31.01.2014", "c 01.01.2014 по 31.01.2014" };
            string[] answer  = { "10.01.2014", "15.01.2014", "31.01.2014", "31.01.2014" };

            var engine = new CalcEngine.CalcEngine();

            for (int i = 0; i < example.Length; i++)
            {
                engine.Variables.Clear();
                engine.Variables.Add("Mask", mask[i]);
                engine.Variables.Add("Date", example[i]);

                var res = (string)engine.Evaluate("LASTDATEININTERVAL(Date,Mask)");
                res.Should().Be(answer[i]);
            }
        }
 public StatisticalFunctionTest()
 {
     calcEngine = new CalcEngine.CalcEngine();
 }
示例#10
0
 public CalcUnaryExpressionTest()
 {
     calcEngine = new CalcEngine.CalcEngine();
 }
 public CalcBindingExpressionTest2()
 {
     calcEngine             = new CalcEngine.CalcEngine();
     calcEngine.DataContext = students = TestData.GetStudents();
 }
示例#12
0
        private IViewModel GetViewModel()
        {
            var panelCaption    = LookupTitle;
            var itemsSourceType = GetItemsSourceType();

            if (string.IsNullOrEmpty(panelCaption) && itemsSourceType != null)
            {
                panelCaption = GetCaption(itemsSourceType);
            }

            switch (LookupType)
            {
            case RclLookupType.Default:
                var itemsSource = new List <CustomSelectControlBase.SelectListItem>();
                var data        = ItemsSource as IList;
                if (data != null && data.Count > 0)
                {
                    PropertyDescriptorCollection prdesc            = null;
                    PropertyDescriptor           idProp            = null;
                    PropertyDescriptor           displayMemberProp = null;

                    CalcEngine.CalcEngine engine = null;
                    if (!string.IsNullOrEmpty(CustomDisplayMember))
                    {
                        engine = new CalcEngine.CalcEngine();
                    }

                    var id = 0;
                    foreach (var d in data)
                    {
                        if (prdesc == null)
                        {
                            prdesc = TypeDescriptor.GetProperties(d);
                        }
                        if (idProp == null)
                        {
                            idProp = prdesc.Find(ValueMember, true);
                        }
                        if (displayMemberProp == null)
                        {
                            displayMemberProp = prdesc.Find(DisplayMember, true);
                        }

                        var item = new CustomSelectControlBase.SelectViewItem {
                            Id = idProp.GetValue(d)
                        };

                        if (engine != null)
                        {
                            try
                            {
                                engine.DataContext = d;
                                item.Name          = engine.Evaluate(CustomDisplayMember).To <string>();
                            }
                            catch (Exception ex)
                            {
                                _log.WarnFormat(
                                    "При попытке получить описание по CustomDisplayMember='{0}' возникла ошибка: {1}",
                                    CustomDisplayMember, ExceptionHelper.ExceptionToString(ex));
                                _log.Debug(ex);
                                // прописываем текст из DisplayMember
                                item.Name = displayMemberProp.GetValue(d).To <string>();
                            }
                        }
                        else
                        {
                            item.Name = displayMemberProp.GetValue(d).To <string>();
                        }

                        var listItem = new CustomSelectControlBase.SelectListItem {
                            Id = id++, Value = item
                        };
                        itemsSource.Add(listItem);
                    }
                }

                var model = new CustomComboBoxEditRclContentViewModel
                {
                    ItemsSource      = itemsSource,
                    SelectedItem     = EditValue,
                    FontSize         = FontSize,
                    UseFunctionKeys  = UseFunctionKeys,
                    ParentKeyPreview = ParentKeyPreview,
                    PanelCaption     = panelCaption
                };

                if (MaxRowsOnPage.HasValue)
                {
                    model.MaxRowsOnPage = MaxRowsOnPage.Value;
                }

                return(model);

            case RclLookupType.DefaultGrid:
                if (itemsSourceType == null)
                {
                    return(null);
                }

                var destType         = typeof(RclLookupViewModel <>).MakeGenericType(itemsSourceType);
                var rclListViewModel = (IRclListViewModel)Activator.CreateInstance(destType);

                rclListViewModel.PanelCaption = panelCaption;
                rclListViewModel.FontSize     = FontSize;
                rclListViewModel.SetItemsSource(ItemsSource);
                rclListViewModel.LayoutValue    = LayoutValue;
                rclListViewModel.IsWfDesignMode = IsWfDesignMode;
                rclListViewModel.SelectedItem   = EditValue;
                return(rclListViewModel);
            }

            return(null);
        }
示例#13
0
        private List <SelectListItem> PrepareItemSource(string valueMember, string displayMember, ICollection itemsSource)
        {
            const string rownumvariable = "rownumvariable";
            var          result         = new List <SelectListItem>();

            if (!string.IsNullOrEmpty(valueMember) && !string.IsNullOrEmpty(displayMember) && itemsSource != null && itemsSource.Count > 0)
            {
                PropertyDescriptorCollection prdesc            = null;
                PropertyDescriptor           idProp            = null;
                PropertyDescriptor           displayMemberProp = null;

                CalcEngine.CalcEngine engine = null;
                var customDisplayMember      = CustomDisplayMember;
                if (!string.IsNullOrEmpty(CustomDisplayMember))
                {
                    engine = new CalcEngine.CalcEngine();
                    if (customDisplayMember.Contains(ValueDataFieldConstants.RowNumberFlag))
                    {
                        customDisplayMember = CustomDisplayMember.Replace(ValueDataFieldConstants.RowNumberFlag, rownumvariable);
                        if (!engine.Variables.ContainsKey(rownumvariable))
                        {
                            engine.Variables.Add(rownumvariable, 0);
                        }
                    }
                }

                var id = 0;
                foreach (var d in itemsSource)
                {
                    if (prdesc == null)
                    {
                        prdesc = TypeDescriptor.GetProperties(d);
                    }
                    if (idProp == null)
                    {
                        idProp = prdesc.Find(valueMember, true);
                    }
                    if (displayMemberProp == null)
                    {
                        displayMemberProp = prdesc.Find(displayMember, true);
                    }

                    var item = new SelectViewItem {
                        Id = idProp.GetValue(d)
                    };

                    if (engine != null)
                    {
                        try
                        {
                            if (engine.Variables.ContainsKey(rownumvariable))
                            {
                                engine.Variables[rownumvariable] = id + 1;
                            }
                            engine.DataContext = d;
                            item.Name          = engine.Evaluate(customDisplayMember).To <string>();
                        }
                        catch (Exception ex)
                        {
                            _log.WarnFormat("При попытке получить описание по CustomDisplayMember='{0}' возникла ошибка: {1}", CustomDisplayMember, ExceptionHelper.ExceptionToString(ex));
                            _log.Debug(ex);
                            // прописываем текст из DisplayMember
                            item.Name = displayMemberProp.GetValue(d).To <string>();
                        }
                    }
                    else
                    {
                        item.Name = displayMemberProp.GetValue(d).To <string>();
                    }

                    var listItem = new SelectListItem {
                        Id = id++, Value = item
                    };
                    result.Add(listItem);
                }
            }
            return(result);
        }
 public void Dispose()
 {
     calcEngine = null;
 }
 public CalcDictionary(CalcEngine.CalcEngine ce)
 {
     _ce  = ce;
     _dct = new Dictionary <string, object>();
 }
 public MathFunctionTest()
 {
     calcEngine = new CalcEngine.CalcEngine();
 }
示例#17
0
        static void RunBenchmark(BenchmarkKind which)
        {
            var yamp = new YAMP.Parser();
            var mpparser = new MathParser.Parser();
            var mptk = new MathParserTK_NET.MathParserTK();
            var mpnet = new MathParserNet.Parser();
            var mfmp = new MathFunctions.MathParser();
            var llmp = new MathParserDataStructures.MathObj();
            var calcEngine = new CalcEngine.CalcEngine();
            calcEngine.CacheExpressions = false;

            var lines = new string[0];

            switch (which)
            {
                case BenchmarkKind.Standard:
                    //         UB
                    //YAMP  : 154 ms
                    //LLMP  : 108 ms
                    //MP    : 4134 ms
                    //MPTK  : 375 ms
                    //MPNET : 3054 ms
                    //MFP   : 88 ms
                    //CALEN : 33 ms
                    //NCALC : 420 ms
                    lines = MakeTenK("2-3*5+7/2-8*2");
                    break;

                case BenchmarkKind.File:
                    //         UB
                    //YAMP  : 2084 ms
                    //LLMP  : 1072 ms
                    //MP    : 372847 ms
                    //MPTK  : ---
                    //MPNET : ---
                    //MFP   : ---
                    //CALEN : 271 ms
                    //NCALC : ---
                    if (!File.Exists(BMK_FILE))
                        GenerateBenchmarks();

                    lines = File.ReadAllLines(BMK_FILE);
                    break;

                case BenchmarkKind.Little:
                    //         UB
                    //YAMP  : 71 ms
                    //LLMP  : 59 ms
                    //MP    : 1840 ms
                    //MPTK  : 87 ms
                    //MPNET : 3232 ms
                    //MFP   : 37 ms
                    //CALEN : 23 ms
                    //NCALC : 247 ms
                    lines = MakeTenK("2+3");
                    break;

                case BenchmarkKind.Thomson:
                    //         UB
                    //YAMP  : 193 ms
                    //LLMP  : 138 ms
                    //MP    : 11508 ms
                    //MPTK  : 647 ms
                    //MPNET : 3827 ms
                    //MFP   : ---
                    //CALEN : 41 ms
                    //NCALC : ---
                    lines = MakeTenK("2-(3*5)^2+7/(2-8)*2");
                    break;
            }

            Console.WriteLine("Starting benchmarks ...");
            Console.WriteLine("----------");

            // The implementation here... YAMP
            Benchmark("YAMP", lines, query => yamp.Evaluate(query));

            //http://www.codeproject.com/Articles/53001/LL-Mathematical-Parser
            Benchmark("LLMathParser", lines, query => llmp.Evaluate(query, new char[0], new double[0]));

            //http://www.codeproject.com/Articles/11164/Math-Parser
            Benchmark("MathParser", lines, query => mpparser.Evaluate(query));

            //http://www.codeproject.com/Tips/381509/Math-Parser-NET-Csharp
            Benchmark("MathParserTK", lines, query => mptk.Parse(query, false));

            //http://www.codeproject.com/Articles/274093/Math-Parser-NET
            Benchmark("MathParserNet", lines, query => mpnet.Simplify(query));

            //http://www.codeproject.com/Articles/23061/MathParser-Math-Formula-Parser
            Benchmark("MathFormulaParser", lines, query => mfmp.Calculate(query));

            //http://www.codeproject.com/Articles/246374/A-Calculation-Engine-for-NET
            Benchmark("CalcEngine", lines, query => calcEngine.Evaluate(query));

            //http://ncalc.codeplex.com/
            //Benchmark("NCalc", lines, query => new NCalc.Expression(query, NCalc.EvaluateOptions.NoCache).Evaluate());
        }
示例#18
0
        public void TestCalcEngineHourDiff()
        {
            //HourDiff([дата с], [дата по],[формат даты])
            string[] maskDate   = { "dd.MM.yyyy HH:mm", "dd.MM.yyyy HH:mm" };
            string[] dateFrom   = { "01.01.2014 11:00", "01.02.2014 21:00" };
            string[] dateTo     = { "01.01.2014 13:30", "02.02.2014 03:00" };
            double[] answerDate = { 2.5, 6 };

            //HourDiff([период с по],[формат даты])
            string[] maskInterval   = { "dd.MM.yyyy HH:mm", "dd.MM.yyyy HH:mm", };
            string[] interval       = { "01.01.2014 15:30 - 01.01.2014 16:00 ", " c 01.01.2014 22:00 по 02.01.2014 02:00" };
            double[] answerInterval = { 0.5, 4 };

            //HourDiff([время с], [время по])
            string[] timeFrom   = { "11:00", "21:00" };
            string[] timeTo     = { "13:30", "00:00" };
            double[] answerTime = { 2.5, 3 };

            //HourDiff([период времен])
            string[] timeInterval       = { "09:00 - 13:30", "21:00 - 00:00" };
            double[] answerTimeInterval = { 4.5, 3 };


            var engine = new CalcEngine.CalcEngine();

            for (int i = 0; i < dateFrom.Length; i++)
            {
                engine.Variables.Clear();
                engine.Variables.Add("Mask", maskDate[i]);
                engine.Variables.Add("DateFrom", dateFrom[i]);
                engine.Variables.Add("DateTo", dateTo[i]);

                var res = (double)engine.Evaluate("HOURDIFF(DateFrom,DateTo,Mask)");
                res.Should().Be(answerDate[i]);
            }

            for (int i = 0; i < interval.Length; i++)
            {
                engine.Variables.Clear();
                engine.Variables.Add("Mask", maskInterval[i]);
                engine.Variables.Add("Interval", interval[i]);

                var res = (double)engine.Evaluate("HOURDIFF(Interval,Mask)");
                res.Should().Be(answerInterval[i]);
            }

            for (int i = 0; i < timeFrom.Length; i++)
            {
                engine.Variables.Clear();
                engine.Variables.Add("TimeFrom", timeFrom[i]);
                engine.Variables.Add("TimeTo", timeTo[i]);

                var res = (double)engine.Evaluate("HOURDIFF(TimeFrom,TimeTo)");
                res.Should().Be(answerTime[i]);
            }

            for (int i = 0; i < timeInterval.Length; i++)
            {
                engine.Variables.Clear();
                engine.Variables.Add("TimeInterval", timeInterval[i]);

                var res = (double)engine.Evaluate("HOURDIFF(TimeInterval)");
                res.Should().Be(answerTimeInterval[i]);
            }
        }
示例#19
0
 public CollectionFunctionTest()
 {
     calcEngine             = new CalcEngine.CalcEngine();
     calcEngine.DataContext = students = TestData.GetStudents();
 }
示例#20
0
 public CalcCommand()
 {
     engine = new CalcEngine.CalcEngine();
     engine.Variables[VARIABLE_RESULT] = 0;
 }
 public CalcXObjectExpressionTest()
 {
     calcEngine = new CalcEngine.CalcEngine();
 }
 public CalcFunctionExpressionTest()
 {
     calcEngine = new CalcEngine.CalcEngine();
 }
示例#23
0
 public ExpressionContext()
 {
     Expressions = new Dictionary <string, Expression>();
     Variables   = new Dictionary <string, object>();
     _calEngine  = new CalcEngine.CalcEngine();
 }
示例#24
0
        static void RunBenchmark(BenchmarkKind which)
        {
            var yamp       = YAMP.Parser.PrimaryContext;
            var mpparser   = new MathParser.Parser();
            var mptk       = new MathParserTK_NET.MathParserTK();
            var mpnet      = new MathParserNet.Parser();
            var mfmp       = new MathFunctions.MathParser();
            var llmp       = new MathParserDataStructures.MathObj();
            var calcEngine = new CalcEngine.CalcEngine();

            calcEngine.CacheExpressions = false;

            var lines = new string[0];

            switch (which)
            {
            case BenchmarkKind.Standard:
                //         UB
                //YAMP  : 154 ms
                //LLMP  : 108 ms
                //MP    : 4134 ms
                //MPTK  : 375 ms
                //MPNET : 3054 ms
                //MFP   : 88 ms
                //CALEN : 33 ms
                //NCALC : 420 ms
                lines = MakeTenK("2-3*5+7/2-8*2");
                break;

            case BenchmarkKind.File:
                //         UB
                //YAMP  : 2084 ms
                //LLMP  : 1072 ms
                //MP    : 372847 ms
                //MPTK  : ---
                //MPNET : ---
                //MFP   : ---
                //CALEN : 271 ms
                //NCALC : ---
                if (!File.Exists(BMK_FILE))
                {
                    GenerateBenchmarks();
                }

                lines = File.ReadAllLines(BMK_FILE);
                break;

            case BenchmarkKind.Little:
                //         UB
                //YAMP  : 71 ms
                //LLMP  : 59 ms
                //MP    : 1840 ms
                //MPTK  : 87 ms
                //MPNET : 3232 ms
                //MFP   : 37 ms
                //CALEN : 23 ms
                //NCALC : 247 ms
                lines = MakeTenK("2+3");
                break;

            case BenchmarkKind.Thomson:
                //         UB
                //YAMP  : 193 ms
                //LLMP  : 138 ms
                //MP    : 11508 ms
                //MPTK  : 647 ms
                //MPNET : 3827 ms
                //MFP   : ---
                //CALEN : 41 ms
                //NCALC : ---
                lines = MakeTenK("2-(3*5)^2+7/(2-8)*2");
                break;
            }

            Console.WriteLine("Starting benchmarks ...");
            Console.WriteLine("----------");

            // The implementation here... YAMP
            Benchmark("YAMP", lines, query => yamp.Run(query));

            //http://www.codeproject.com/Articles/53001/LL-Mathematical-Parser
            Benchmark("LLMathParser", lines, query => llmp.Evaluate(query, new char[0], new double[0]));

            //http://www.codeproject.com/Articles/11164/Math-Parser
            Benchmark("MathParser", lines, query => mpparser.Evaluate(query));

            //http://www.codeproject.com/Tips/381509/Math-Parser-NET-Csharp
            Benchmark("MathParserTK", lines, query => mptk.Parse(query, false));

            //http://www.codeproject.com/Articles/274093/Math-Parser-NET
            Benchmark("MathParserNet", lines, query => mpnet.Simplify(query));

            //http://www.codeproject.com/Articles/23061/MathParser-Math-Formula-Parser
            Benchmark("MathFormulaParser", lines, query => mfmp.Calculate(query));

            //http://www.codeproject.com/Articles/246374/A-Calculation-Engine-for-NET
            Benchmark("CalcEngine", lines, query => calcEngine.Evaluate(query));

            //http://ncalc.codeplex.com/
            //Benchmark("NCalc", lines, query => new NCalc.Expression(query, NCalc.EvaluateOptions.NoCache).Evaluate());
        }
 public LogicalFunctionTest()
 {
     calcEngine = new CalcEngine.CalcEngine();
 }
 public TextFunctionTest()
 {
     calcEngine = new CalcEngine.CalcEngine();
 }
示例#27
0
 private static void EvaluateExpressionAndAssign(CalcExpressionVm calcVm, CellVm targetCell)
 {
     var expr = new CalcEngine.CalcEngine();
     var result = (double)expr.Evaluate(calcVm.Expression);
     if (UpdateContextIsCellValue(calcVm.UpdateContext))
     {
         targetCell.Value = FormatCellValue(result, targetCell);
     }
     else
     {
         FormatCellHoverAddition(result, targetCell);
     }
 }
        private void Calc()
        {
            var cpv = _billOperation2Contract.Operation2ContractCpvL;

            if (cpv != null)
            {
                var formulaDate    = cpv.FirstOrDefault(p => p != null && p.CustomParamCode.EqIgnoreCase("BillO2CCalcFDateL2"));
                var formulaDateStr = formulaDate != null && _dateTimeFormats != null ? formulaDate.CPVValue : string.Empty;

                var formulaCount    = cpv.FirstOrDefault(p => p != null && p.CustomParamCode.EqIgnoreCase("BillO2CCalcFCountL2"));
                var formulaCountStr = formulaCount != null ? formulaCount.CPVValue : string.Empty;

                var formulaFactor    = cpv.FirstOrDefault(p => p != null && p.CustomParamCode.EqIgnoreCase("BillO2CCalcFFactorL2"));
                var formulaFactorStr = formulaFactor != null  ? formulaFactor.CPVValue : string.Empty;

                var formulaSumm    = cpv.FirstOrDefault(p => p != null && p.CustomParamCode.EqIgnoreCase("BillO2CCalcFSummL2"));
                var formulaSummStr = formulaSumm != null  ? formulaSumm.CPVValue : string.Empty;

                var engine = new CalcEngine.CalcEngine {
                    DataContext = Source
                };

                //дата
                DateTime?date;
                if (!formulaDateStr.IsNullOrEmptyAfterTrim())
                {
                    var culture = System.Threading.Thread.CurrentThread.CurrentCulture;
                    try
                    {
                        date = new StringToDateTimeConverter().Convert(engine.Evaluate(formulaDateStr), null, _dateTimeFormats, culture) as DateTime?;
                    }
                    catch (Exception)
                    {
                        date = null;
                    }
                }
                else
                {
                    date = _defaltCalcDate;
                }

                //цена
                double price = 0;
                if (date.HasValue)
                {
                    using (var mgrTariff = IoC.Instance.Resolve <IBaseManager <BillTariff> >())
                    {
                        var filter =
                            string.Format(
                                "operation2contractid_r = {0} and TO_DATE('{1}','YYYY.MM.DD') >= tariffdatefrom and TO_DATE('{1}','YYYY.MM.DD') < tariffdatetill",
                                Source.Operation2ContractID, ((DateTime)date).ToString("yyyy.MM.dd"));
                        var values = mgrTariff.GetFiltered(filter).ToArray();
                        if (values.Length == 1)
                        {
                            price = values[0].Value;
                        }
                    }
                }
                engine.Variables.Add("PRICE", price);

                //кол-во
                double count;
                if (!formulaCountStr.IsNullOrEmptyAfterTrim())
                {
                    try
                    {
                        if (!double.TryParse(engine.Evaluate(formulaCountStr).ToString(), out count))
                        {
                            count = 0;
                        }
                    }
                    catch (Exception)
                    {
                        count = 0;
                    }
                }
                else
                {
                    count = DefaultCalcCount;
                }
                Source.WorkActDetailCount = count;

                //коэффициент
                double factor;
                if (!formulaFactorStr.IsNullOrEmptyAfterTrim())
                {
                    try
                    {
                        if (!double.TryParse(engine.Evaluate(formulaFactorStr).ToString(), out factor))
                        {
                            factor = 0;
                        }
                    }
                    catch (Exception)
                    {
                        factor = 0;
                    }
                }
                else
                {
                    factor = DefaultCalcFactor;
                }
                Source.WorkActDetailMulti = factor;

                //сумма
                if (!Source.IsEnabledTotalSum)
                {
                    double summ = 0;
                    if (!formulaSummStr.IsNullOrEmptyAfterTrim())
                    {
                        try
                        {
                            if (!double.TryParse(engine.Evaluate(formulaSummStr).ToString(), out summ))
                            {
                                summ = 0;
                            }
                        }
                        catch (Exception)
                        {
                            summ = 0;
                        }
                    }
                    Source.WorkActDetailTotalSum = summ;
                }
            }
        }
 public CalcVariableExpressionTest()
 {
     calcEngine           = new CalcEngine.CalcEngine();
     calcEngine.Variables = TestData.GetDictory();
 }