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]); } }
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)); }
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]"); }
public ICommandResult Execute(CommandContext context) { string expression = string.Join(string.Empty, context.Parameters["expression"].GetValues()); try { object result = engine.Evaluate(expression); engine.Variables[VARIABLE_RESULT] = result; if (context.HasOption("variable")) { var variableContext = context.GetOption("variable"); string variableName = variableContext.GetParameterValue("variableName"); engine.Variables[variableName] = result; return(new TextResult($"{variableName} = {result}")); } else { return(new TextResult(result.ToString())); } } catch (Exception exception) { return(new ErrorTextResult(exception.Message)); } }
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()); }
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); }
public bool TryGetValue(string key, out object value) { if (_dct.TryGetValue(key, out value)) { var expr = value as string; if (expr != null && expr.Length > 0 && expr[0] == '=') { value = _ce.Evaluate(expr.Substring(1)); } return(true); } return(false); }
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, *"); }
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")); }
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]); } }
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; } } }
//[InlineData("SUBSTITUTE(\"abracadabra\", \"a\", \"b\")", "bbrbcbdbbrb")] //[InlineData("SUBSTITUTE(\"abcabcabc\", \"a\", \"b\")", "bbcbbcbbc")] //[InlineData("SUBSTITUTE(\"abcabcabc\", \"a\", \"b\", 1)", "bbcabcabc")] //[InlineData("SUBSTITUTE(\"abcabcabc\", \"a\", \"b\", 2)", "abcbbcabc")] //[InlineData("SUBSTITUTE(\"abcabcabc\", \"A\", \"b\", 2)", "abcabcabc")] public void ShouldAverageExpressionEquals(string expression, object expected) { var result = calcEngine.Evaluate(expression); Assert.Equal(expected, result); }
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 void ShouldItemWhereExpressionEquals() { var result = calcEngine.Evaluate("WHERE(Item,Score>90)"); Assert.Equal(students.Where(o => o.Score > 90), result); }
public void ShouldCapacityEquals() { var result = calcEngine.Evaluate("capacity"); Assert.Equal(students.Capacity, result); }
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); } }
public void ShouldNameEquals() { var result = calcEngine.Evaluate("Name"); Assert.Equal(student.Name, result); }
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]); } }
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()); }