Skip to content

Commit 1a04db2

Browse files
committed
添加 EvaluateFormula
1 parent e29dff2 commit 1a04db2

File tree

6 files changed

+187
-5
lines changed

6 files changed

+187
-5
lines changed

csharp/ToolGood.Algorithm2.Test/AlgorithmEngineEx/AlgorithmEngineExTest.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ public void Test()
6565

6666
var p4 = priceAlgorithm.TryEvaluate("出错了", 0.0);
6767

68+
69+
var tt = priceAlgorithm.EvaluateFormula("长-宽-高", '-');
70+
Assert.AreEqual("9-1.3-1", tt);
6871
}
6972
[Test]
7073
public void Test2()

csharp/ToolGood.Algorithm2/AlgorithmEngine.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -718,7 +718,7 @@ public String EvaluateFormula(String formula, params char[] splitChars)
718718
/// <param name="formula">公式</param>
719719
/// <param name="splitChars">分隔符</param>
720720
/// <returns></returns>
721-
public String EvaluateFormula(String formula, List<char> splitChars)
721+
public virtual String EvaluateFormula(String formula, List<char> splitChars)
722722
{
723723
if (string.IsNullOrEmpty(formula)) return "";
724724

@@ -732,11 +732,11 @@ public String EvaluateFormula(String formula, List<char> splitChars)
732732
} else {
733733
// TODO 替换此处
734734
String d = TryEvaluate(s, "");
735-
stringBuilder.Append(d.ToString());
735+
stringBuilder.Append(d);
736736
}
737737
}
738738
return stringBuilder.ToString();
739-
}
739+
}
740740
#endregion
741741

742742
}

csharp/ToolGood.Algorithm2/AlgorithmEngineEx.cs

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System;
1+
using Antlr4.Runtime;
2+
using System;
23
using System.Collections.Generic;
34
using System.Linq;
45
using System.Text;
@@ -736,5 +737,88 @@ private Operand Evaluate(ProgContext context)
736737

737738
}
738739

740+
#region EvaluateFormula
741+
/// <summary>
742+
/// 计算公式
743+
/// </summary>
744+
/// <param name="formula">公式</param>
745+
/// <param name="splitChars">分隔符</param>
746+
/// <returns></returns>
747+
public String EvaluateFormula(String formula, params char[] splitChars)
748+
{
749+
if (string.IsNullOrEmpty(formula)) return "";
750+
return EvaluateFormula(formula, splitChars.ToList());
751+
}
752+
/// <summary>
753+
/// 计算公式
754+
/// </summary>
755+
/// <param name="formula">公式</param>
756+
/// <param name="splitChars">分隔符</param>
757+
/// <returns></returns>
758+
public virtual String EvaluateFormula(String formula, List<char> splitChars)
759+
{
760+
if (string.IsNullOrEmpty(formula)) return "";
761+
762+
List<String> sp = CharUtil.SplitFormula(formula, splitChars);
763+
764+
StringBuilder stringBuilder = new StringBuilder();
765+
for (int i = 0; i < sp.Count; i++) {
766+
String s = sp[i];
767+
if (s.Length == 1 && splitChars.Contains(s[0])) {
768+
stringBuilder.Append(s);
769+
} else {
770+
String d = "";
771+
try {
772+
Operand operand = EvaluateOnce(s);
773+
d = operand.ToText().TextValue;
774+
} catch (Exception) { }
775+
stringBuilder.Append(d);
776+
}
777+
}
778+
return stringBuilder.ToString();
779+
}
780+
/// <summary>
781+
/// 执行一次
782+
/// </summary>
783+
/// <param name="exp"></param>
784+
/// <returns></returns>
785+
protected Operand EvaluateOnce(string exp)
786+
{
787+
ProgContext context = Parse(exp);
788+
return Evaluate(context);
789+
}
790+
791+
private ProgContext Parse(string exp)
792+
{
793+
if (string.IsNullOrWhiteSpace(exp)) { return null; }
794+
try {
795+
var stream = new AntlrCharStream(new AntlrInputStream(exp));
796+
var lexer = new mathLexer(stream);
797+
var tokens = new CommonTokenStream(lexer);
798+
var parser = new mathParser(tokens);
799+
var antlrErrorListener = new AntlrErrorListener();
800+
parser.RemoveErrorListeners();
801+
parser.AddErrorListener(antlrErrorListener);
802+
803+
var context = parser.prog();
804+
var end = context.Stop.StopIndex;
805+
if (end + 1 < exp.Length) {
806+
807+
LastError = "Parameter exp invalid !";
808+
return null;
809+
}
810+
if (antlrErrorListener.IsError) {
811+
LastError = antlrErrorListener.ErrorMsg;
812+
return null;
813+
}
814+
return context;
815+
} catch (Exception ex) {
816+
LastError = ex.Message;
817+
}
818+
return null;
819+
}
820+
#endregion
821+
822+
739823
}
740824
}

java/toolgood.algorithm/src/main/java/toolgood/algorithm/AlgorithmEngine.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ public String EvaluateFormula(String formula, List<Character> splitChars) {
306306
} else {
307307
// TODO 替换此处
308308
String d = TryEvaluate(s, "");
309-
stringBuilder.append(d.toString());
309+
stringBuilder.append(d);
310310
}
311311
}
312312
return stringBuilder.toString();

java/toolgood.algorithm/src/main/java/toolgood/algorithm/AlgorithmEngineEx.java

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,20 @@
77
import java.util.Map;
88
import java.util.function.Function;
99

10+
import org.antlr.v4.runtime.CharStreams;
11+
import org.antlr.v4.runtime.CommonTokenStream;
1012
import org.joda.time.DateTime;
1113

14+
import toolgood.algorithm.internals.AntlrCharStream;
15+
import toolgood.algorithm.internals.AntlrErrorListener;
16+
import toolgood.algorithm.internals.CharUtil;
1217
import toolgood.algorithm.internals.ConditionCacheInfo;
1318
import toolgood.algorithm.internals.MathVisitor;
1419
import toolgood.algorithm.internals.MyFunction;
1520
import toolgood.algorithm.litJson.JsonData;
1621
import toolgood.algorithm.litJson.JsonMapper;
22+
import toolgood.algorithm.math.mathLexer;
23+
import toolgood.algorithm.math.mathParser;
1724
import toolgood.algorithm.math.mathParser2.ProgContext;
1825

1926
/**
@@ -374,4 +381,89 @@ private Operand Evaluate(ProgContext context) {
374381
}
375382
}
376383

384+
/**
385+
* 计算公式
386+
*
387+
* @param formula 公式
388+
* @param splitChar 分隔符
389+
* @return
390+
*/
391+
public String EvaluateFormula(String formula, Character splitChar) {
392+
if (formula == null || formula.equals(""))
393+
return "";
394+
List<Character> splitChars = new ArrayList<>();
395+
splitChars.add(splitChar);
396+
return EvaluateFormula(formula, splitChars);
397+
}
398+
399+
/**
400+
* 计算公式
401+
*
402+
* @param formula 公式
403+
* @param splitChars 分隔符
404+
* @return
405+
*/
406+
public String EvaluateFormula(String formula, List<Character> splitChars) {
407+
if (formula == null || formula.equals(""))
408+
return "";
409+
List<String> sp = CharUtil.SplitFormula(formula, splitChars);
410+
411+
StringBuilder stringBuilder = new StringBuilder();
412+
for (int i = 0; i < sp.size(); i++) {
413+
String s = sp.get(i);
414+
if (s.length() == 1 && splitChars.contains(s.charAt(0))) {
415+
stringBuilder.append(s);
416+
} else {
417+
String d = "";
418+
try {
419+
Operand operand = EvaluateOnce(s);
420+
d = operand.ToText("").TextValue();
421+
} catch (Exception ex) { }
422+
stringBuilder.append(d);
423+
}
424+
}
425+
return stringBuilder.toString();
426+
}
427+
428+
/// <summary>
429+
/// 执行一次
430+
/// </summary>
431+
/// <param name="exp"></param>
432+
/// <returns></returns>
433+
protected Operand EvaluateOnce(String exp) {
434+
ProgContext context = Parse(exp);
435+
return Evaluate(context);
436+
}
437+
438+
private ProgContext Parse(String exp) {
439+
if (exp == null || exp.equals("")) {
440+
LastError = "Parameter exp invalid !";
441+
return null;
442+
}
443+
try {
444+
final AntlrCharStream stream = new AntlrCharStream(CharStreams.fromString(exp));
445+
final mathLexer lexer = new mathLexer(stream);
446+
final CommonTokenStream tokens = new CommonTokenStream(lexer);
447+
final mathParser parser = new mathParser(tokens);
448+
final AntlrErrorListener antlrErrorListener = new AntlrErrorListener();
449+
parser.removeErrorListeners();
450+
parser.addErrorListener(antlrErrorListener);
451+
final ProgContext context = parser.prog();
452+
453+
final int end = context.stop.getStopIndex();
454+
if (end + 1 < exp.length()) {
455+
LastError = "Parameter exp invalid !";
456+
return null;
457+
}
458+
if (antlrErrorListener.IsError) {
459+
LastError = antlrErrorListener.ErrorMsg;
460+
return null;
461+
}
462+
return context;
463+
} catch (Exception ex) {
464+
LastError = ex.getMessage();
465+
}
466+
return null;
467+
}
468+
377469
}

java/toolgood.algorithm/src/test/java/toolgood/algorithm/Test2/AlgorithmEngineExTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ public void Test2() {
105105

106106
Double p4 = priceAlgorithm.TryEvaluate("出错了", 0.0);
107107

108+
String tt = priceAlgorithm.EvaluateFormula("长-宽-高", '-');
109+
assertEquals("9-1.3-1", tt);
110+
108111
}
109112

110113
@Test

0 commit comments

Comments
 (0)