Skip to content

Commit 0c0b8b6

Browse files
committed
大版本更新 ,部分公式不兼容2版本,增加算法套算法
1 parent 3728d04 commit 0c0b8b6

25 files changed

+15489
-13906
lines changed

csharp/ToolGood.Algorithm2.MathParserReplace/Program.cs

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -12,42 +12,44 @@ static void Main(string[] args)
1212
{
1313
var str = @"T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9,
1414
T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, T__14=15, T__15=16, T__16=17,
15-
T__17=18, T__18=19, T__19=20, T__20=21, T__21=22, T__22=23, SUB=24, NUM=25,
16-
STRING=26, NULL=27, IF=28, IFERROR=29, ISNUMBER=30, ISTEXT=31, ISERROR=32,
17-
ISNONTEXT=33, ISLOGICAL=34, ISEVEN=35, ISODD=36, ISNULL=37, ISNULLORERROR=38,
18-
AND=39, OR=40, NOT=41, TRUE=42, FALSE=43, E=44, PI=45, DEC2BIN=46, DEC2HEX=47,
19-
DEC2OCT=48, HEX2BIN=49, HEX2DEC=50, HEX2OCT=51, OCT2BIN=52, OCT2DEC=53,
20-
OCT2HEX=54, BIN2OCT=55, BIN2DEC=56, BIN2HEX=57, ABS=58, QUOTIENT=59, MOD=60,
21-
SIGN=61, SQRT=62, TRUNC=63, INT=64, GCD=65, LCM=66, COMBIN=67, PERMUT=68,
22-
DEGREES=69, RADIANS=70, COS=71, COSH=72, SIN=73, SINH=74, TAN=75, TANH=76,
23-
ACOS=77, ACOSH=78, ASIN=79, ASINH=80, ATAN=81, ATANH=82, ATAN2=83, ROUND=84,
24-
ROUNDDOWN=85, ROUNDUP=86, CEILING=87, FLOOR=88, EVEN=89, ODD=90, MROUND=91,
25-
RAND=92, RANDBETWEEN=93, FACT=94, FACTDOUBLE=95, POWER=96, EXP=97, LN=98,
26-
LOG=99, LOG10=100, MULTINOMIAL=101, PRODUCT=102, SQRTPI=103, SUMSQ=104,
27-
ASC=105, JIS=106, CHAR=107, CLEAN=108, CODE=109, CONCATENATE=110, EXACT=111,
28-
FIND=112, FIXED=113, LEFT=114, LEN=115, LOWER=116, MID=117, PROPER=118,
29-
REPLACE=119, REPT=120, RIGHT=121, RMB=122, SEARCH=123, SUBSTITUTE=124,
30-
T=125, TEXT=126, TRIM=127, UPPER=128, VALUE=129, DATEVALUE=130, TIMEVALUE=131,
31-
DATE=132, TIME=133, NOW=134, TODAY=135, YEAR=136, MONTH=137, DAY=138,
32-
HOUR=139, MINUTE=140, SECOND=141, WEEKDAY=142, DATEDIF=143, DAYS360=144,
33-
EDATE=145, EOMONTH=146, NETWORKDAYS=147, WORKDAY=148, WEEKNUM=149, MAX=150,
34-
MEDIAN=151, MIN=152, QUARTILE=153, MODE=154, LARGE=155, SMALL=156, PERCENTILE=157,
35-
PERCENTRANK=158, AVERAGE=159, AVERAGEIF=160, GEOMEAN=161, HARMEAN=162,
36-
COUNT=163, COUNTIF=164, SUM=165, SUMIF=166, AVEDEV=167, STDEV=168, STDEVP=169,
37-
DEVSQ=170, VAR=171, VARP=172, NORMDIST=173, NORMINV=174, NORMSDIST=175,
38-
NORMSINV=176, BETADIST=177, BETAINV=178, BINOMDIST=179, EXPONDIST=180,
39-
FDIST=181, FINV=182, FISHER=183, FISHERINV=184, GAMMADIST=185, GAMMAINV=186,
40-
GAMMALN=187, HYPGEOMDIST=188, LOGINV=189, LOGNORMDIST=190, NEGBINOMDIST=191,
41-
POISSON=192, TDIST=193, TINV=194, WEIBULL=195, URLENCODE=196, URLDECODE=197,
42-
HTMLENCODE=198, HTMLDECODE=199, BASE64TOTEXT=200, BASE64URLTOTEXT=201,
43-
TEXTTOBASE64=202, TEXTTOBASE64URL=203, REGEX=204, REGEXREPALCE=205, ISREGEX=206,
44-
GUID=207, MD5=208, SHA1=209, SHA256=210, SHA512=211, CRC32=212, HMACMD5=213,
45-
HMACSHA1=214, HMACSHA256=215, HMACSHA512=216, TRIMSTART=217, TRIMEND=218,
46-
INDEXOF=219, LASTINDEXOF=220, SPLIT=221, JOIN=222, SUBSTRING=223, STARTSWITH=224,
47-
ENDSWITH=225, ISNULLOREMPTY=226, ISNULLORWHITESPACE=227, REMOVESTART=228,
48-
REMOVEEND=229, JSON=230, VLOOKUP=231, LOOKUP=232, PARAMETER=233, WS=234
15+
T__17=18, T__18=19, T__19=20, T__20=21, T__21=22, T__22=23, T__23=24,
16+
T__24=25, T__25=26, SUB=27, LB=28, RB=29, COMMA=30, NUM=31, STRING=32,
17+
NULL=33, IF=34, IFERROR=35, ISNUMBER=36, ISTEXT=37, ISERROR=38, ISNONTEXT=39,
18+
ISLOGICAL=40, ISEVEN=41, ISODD=42, ISNULL=43, ISNULLORERROR=44, AND=45,
19+
OR=46, NOT=47, TRUE=48, FALSE=49, E=50, PI=51, DEC2BIN=52, DEC2HEX=53,
20+
DEC2OCT=54, HEX2BIN=55, HEX2DEC=56, HEX2OCT=57, OCT2BIN=58, OCT2DEC=59,
21+
OCT2HEX=60, BIN2OCT=61, BIN2DEC=62, BIN2HEX=63, ABS=64, QUOTIENT=65, MOD=66,
22+
SIGN=67, SQRT=68, TRUNC=69, INT=70, GCD=71, LCM=72, COMBIN=73, PERMUT=74,
23+
DEGREES=75, RADIANS=76, COS=77, COSH=78, SIN=79, SINH=80, TAN=81, TANH=82,
24+
ACOS=83, ACOSH=84, ASIN=85, ASINH=86, ATAN=87, ATANH=88, ATAN2=89, ROUND=90,
25+
ROUNDDOWN=91, ROUNDUP=92, CEILING=93, FLOOR=94, EVEN=95, ODD=96, MROUND=97,
26+
RAND=98, RANDBETWEEN=99, FACT=100, FACTDOUBLE=101, POWER=102, EXP=103,
27+
LN=104, LOG=105, LOG10=106, MULTINOMIAL=107, PRODUCT=108, SQRTPI=109,
28+
SUMSQ=110, ASC=111, JIS=112, CHAR=113, CLEAN=114, CODE=115, CONCATENATE=116,
29+
EXACT=117, FIND=118, FIXED=119, LEFT=120, LEN=121, LOWER=122, MID=123,
30+
PROPER=124, REPLACE=125, REPT=126, RIGHT=127, RMB=128, SEARCH=129, SUBSTITUTE=130,
31+
T=131, TEXT=132, TRIM=133, UPPER=134, VALUE=135, DATEVALUE=136, TIMEVALUE=137,
32+
DATE=138, TIME=139, NOW=140, TODAY=141, YEAR=142, MONTH=143, DAY=144,
33+
HOUR=145, MINUTE=146, SECOND=147, WEEKDAY=148, DATEDIF=149, DAYS360=150,
34+
EDATE=151, EOMONTH=152, NETWORKDAYS=153, WORKDAY=154, WEEKNUM=155, MAX=156,
35+
MEDIAN=157, MIN=158, QUARTILE=159, MODE=160, LARGE=161, SMALL=162, PERCENTILE=163,
36+
PERCENTRANK=164, AVERAGE=165, AVERAGEIF=166, GEOMEAN=167, HARMEAN=168,
37+
COUNT=169, COUNTIF=170, SUM=171, SUMIF=172, AVEDEV=173, STDEV=174, STDEVP=175,
38+
DEVSQ=176, VAR=177, VARP=178, NORMDIST=179, NORMINV=180, NORMSDIST=181,
39+
NORMSINV=182, BETADIST=183, BETAINV=184, BINOMDIST=185, EXPONDIST=186,
40+
FDIST=187, FINV=188, FISHER=189, FISHERINV=190, GAMMADIST=191, GAMMAINV=192,
41+
GAMMALN=193, HYPGEOMDIST=194, LOGINV=195, LOGNORMDIST=196, NEGBINOMDIST=197,
42+
POISSON=198, TDIST=199, TINV=200, WEIBULL=201, URLENCODE=202, URLDECODE=203,
43+
HTMLENCODE=204, HTMLDECODE=205, BASE64TOTEXT=206, BASE64URLTOTEXT=207,
44+
TEXTTOBASE64=208, TEXTTOBASE64URL=209, REGEX=210, REGEXREPALCE=211, ISREGEX=212,
45+
GUID=213, MD5=214, SHA1=215, SHA256=216, SHA512=217, CRC32=218, HMACMD5=219,
46+
HMACSHA1=220, HMACSHA256=221, HMACSHA512=222, TRIMSTART=223, TRIMEND=224,
47+
INDEXOF=225, LASTINDEXOF=226, SPLIT=227, JOIN=228, SUBSTRING=229, STARTSWITH=230,
48+
ENDSWITH=231, ISNULLOREMPTY=232, ISNULLORWHITESPACE=233, REMOVESTART=234,
49+
REMOVEEND=235, JSON=236, VLOOKUP=237, LOOKUP=238, ARRAY=239, PARAMETER=240,
50+
PARAMETER2=241, WS=242;
4951
50-
RULE_prog=0, RULE_expr=1, RULE_expr2=2, RULE_parameter=3, RULE_parameter2=4
52+
RULE_prog=0, RULE_expr=1, RULE_expr2=2, RULE_parameter2=3;
5153
";
5254
var array = str.Split(" ,\r\n\t;".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
5355
Dictionary<string, string> dict = new Dictionary<string, string>();

csharp/ToolGood.Algorithm2.MathParserReplace/ToolGood.Algorithm2.MathParserReplace.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>netcoreapp3.1</TargetFramework>
5+
<TargetFramework>net6.0</TargetFramework>
66
</PropertyGroup>
77

88
</Project>

csharp/ToolGood.Algorithm2.PerformanceTest/ToolGood.Algorithm2.PerformanceTest.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>netcoreapp3.1</TargetFramework>
5+
<TargetFramework>net6.0</TargetFramework>
66
</PropertyGroup>
77

88
<ItemGroup>

csharp/ToolGood.Algorithm2.Test/AlgorithmEngine/AlgorithmEngineTest.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public void Test()
7070
s = engine.TryEvaluate("'3'+2", "");
7171
Assert.AreEqual("5", s);
7272

73-
var r = engine.TryEvaluate("count({ 1,2,3,4})", 0);
73+
var r = engine.TryEvaluate("count(Array(1,2,3,4))", 0);
7474
Assert.AreEqual(4, r);
7575

7676

@@ -104,6 +104,10 @@ public void Test()
104104

105105
var value3 = engine.TryEvaluate("-7 < -2", false);
106106
Assert.AreEqual(value3, true);
107+
108+
109+
var t1 = engine.TryEvaluate("-7 < -2?1:2", 1);
110+
Assert.AreEqual(t1, 1);
107111
}
108112

109113
[Test]
@@ -158,6 +162,23 @@ public void Cylinder_Test()
158162
{
159163
Cylinder c = new Cylinder(3, 10);
160164
var t = c.TryEvaluate("[半径]*[半径]*pi()", 0.0); //圆底面积
165+
var t2 = c.TryEvaluate("半径*半径*pi()", 0.0); //圆底面积
166+
167+
var t3 = c.TryEvaluate("{半径}*{半径}*pi()", 0.0); //圆底面积
168+
var t4 = c.TryEvaluate("@半径*@半径*pi()", 0.0); //圆底面积
169+
var t5 = c.TryEvaluate("#半径#*#半径#*pi()", 0.0); //圆底面积
170+
var t6 = c.TryEvaluate("【半径】*【半径】*pi()", 0.0); //圆底面积
171+
var t7 = c.TryEvaluate("【半径】*【半径】*pi()", 0.0); //圆底面积
172+
173+
174+
Assert.AreEqual(t, t2);
175+
Assert.AreEqual(t, t3);
176+
Assert.AreEqual(t, t4);
177+
Assert.AreEqual(t, t5);
178+
Assert.AreEqual(t, t6);
179+
Assert.AreEqual(t, t7);
180+
181+
161182
t = c.TryEvaluate("[直径]*pi()", 0.0); //圆的长
162183
t = c.TryEvaluate("[半径]*[半径]*pi()*[高]", 0.0); //圆的体积
163184

csharp/ToolGood.Algorithm2.Test/AlgorithmEngine/AlgorithmEngineTest_sum.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,15 @@ public void MIN_test()
3535
public void QUARTILE_test()
3636
{
3737
AlgorithmEngine engine = new AlgorithmEngine();
38-
var t = engine.TryEvaluate("QUARTILE({1,2,3,4,2,2,1,4},0)", 0.0);
38+
var t = engine.TryEvaluate("QUARTILE(array(1,2,3,4,2,2,1,4),0)", 0.0);
3939
Assert.AreEqual(t, 1.0);
40-
t = engine.TryEvaluate("QUARTILE({1,2,3,4,2,2,1,4},1)", 0.0);
40+
t = engine.TryEvaluate("QUARTILE(array(1,2,3,4,2,2,1,4),1)", 0.0);
4141
Assert.AreEqual(t, 1.75);
42-
t = engine.TryEvaluate("QUARTILE({1,2,3,4,2,2,1,4},2)", 0.0);
42+
t = engine.TryEvaluate("QUARTILE(array(1,2,3,4,2,2,1,4),2)", 0.0);
4343
Assert.AreEqual(t, 2.0);
44-
t = engine.TryEvaluate("QUARTILE({1,2,3,4,2,2,1,4},3)", 0.0);
44+
t = engine.TryEvaluate("QUARTILE(array(1,2,3,4,2,2,1,4),3)", 0.0);
4545
Assert.AreEqual(t, 3.25);
46-
t = engine.TryEvaluate("QUARTILE({1,2,3,4,2,2,1,4},4)", 0.0);
46+
t = engine.TryEvaluate("QUARTILE(array(1,2,3,4,2,2,1,4),4)", 0.0);
4747
Assert.AreEqual(t, 4.0);
4848
}
4949
[Test]
@@ -57,14 +57,14 @@ public void MODE_test()
5757
public void PERCENTILE_test()
5858
{
5959
AlgorithmEngine engine = new AlgorithmEngine();
60-
var t = engine.TryEvaluate("PERCENTILE({1,2,3,4,2,2,1,4},0.4)", 0.0);
60+
var t = engine.TryEvaluate("PERCENTILE(array(1,2,3,4,2,2,1,4),0.4)", 0.0);
6161
Assert.AreEqual(t, 2.0);
6262
}
6363
[Test]
6464
public void PERCENTRANK_test()
6565
{
6666
AlgorithmEngine engine = new AlgorithmEngine();
67-
var t = engine.TryEvaluate("PERCENTRANK({1,2,3,4,2,2,1,4},3)", 0.0);
67+
var t = engine.TryEvaluate("PERCENTRANK(array(1,2,3,4,2,2,1,4),3)", 0.0);
6868
Assert.AreEqual(t, 0.714);
6969
}
7070

@@ -332,14 +332,14 @@ public void FISHERINV_test()
332332
public void LARGE_test()
333333
{
334334
AlgorithmEngine engine = new AlgorithmEngine();
335-
var t = engine.TryEvaluate("LARGE({1,2,3,4,2,2,1,4},3)", 0.0);
335+
var t = engine.TryEvaluate("LARGE(array(1,2,3,4,2,2,1,4),3)", 0.0);
336336
Assert.AreEqual(Math.Round(t, 6), Math.Round(3.0, 6));
337337
}
338338
[Test]
339339
public void SMALL_test()
340340
{
341341
AlgorithmEngine engine = new AlgorithmEngine();
342-
var t = engine.TryEvaluate("SMALL({1,2,3,4,2,2,1,4},3)", 0.0);
342+
var t = engine.TryEvaluate("SMALL(array(1,2,3,4,2,2,1,4),3)", 0.0);
343343
Assert.AreEqual(Math.Round(t, 6), Math.Round(2.0, 6));
344344
}
345345

@@ -351,26 +351,26 @@ public void SMALL_test()
351351
public void COUNTIF_test()
352352
{
353353
AlgorithmEngine engine = new AlgorithmEngine();
354-
var t = engine.TryEvaluate("COUNTIF({1,2,3,4,2,2,1,4},'>1')", 0.0);
354+
var t = engine.TryEvaluate("COUNTIF(array(1,2,3,4,2,2,1,4),'>1')", 0.0);
355355
Assert.AreEqual(t, 6.0);
356356
}
357357

358358
[Test]
359359
public void SUMIF_test()
360360
{
361361
AlgorithmEngine engine = new AlgorithmEngine();
362-
var t = engine.TryEvaluate("SUMIF({1,2,3,4,2,2,1,4},'>1')", 0.0);
362+
var t = engine.TryEvaluate("SUMIF(array(1,2,3,4,2,2,1,4),'>1')", 0.0);
363363
Assert.AreEqual(t, 17);
364-
t = engine.TryEvaluate("SUMIF({1,2,3,4,2,2,1,4},'>1',{1,1,1,1,1,1,1,1})", 0.0);
364+
t = engine.TryEvaluate("SUMIF(array(1,2,3,4,2,2,1,4),'>1',array(1,1,1,1,1,1,1,1))", 0.0);
365365
Assert.AreEqual(t, 6);
366366
}
367367
[Test]
368368
public void AVERAGEIF_test()
369369
{
370370
AlgorithmEngine engine = new AlgorithmEngine();
371-
var t = engine.TryEvaluate("AVERAGEIF({1,2,3,4,2,2,1,4},'>1')", 0.0);
371+
var t = engine.TryEvaluate("AVERAGEIF(array(1,2,3,4,2,2,1,4),'>1')", 0.0);
372372
Assert.AreEqual(Math.Round(t, 6), Math.Round(2.833333333, 6));
373-
t = engine.TryEvaluate("AVERAGEIF({1,2,3,4,2,2,1,4},'>1',{1,1,1,1,1,1,1,1})", 0.0);
373+
t = engine.TryEvaluate("AVERAGEIF(array(1,2,3,4,2,2,1,4),'>1',array(1,1,1,1,1,1,1,1))", 0.0);
374374
Assert.AreEqual(t, 1);
375375
}
376376

csharp/ToolGood.Algorithm2.Test/AlgorithmEngine/AlgorithmEngineTest_vlookup.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,16 @@ public class AlgorithmEngineTest_vlookup
1313
public void vlookup_test()
1414
{
1515
AlgorithmEngine engine = new AlgorithmEngine();
16-
var num = engine.TryEvaluate("vlookup({{1,2,3},{2,3,4},{3,4,5},{4,5,6}},3,2)", 0);
16+
var num = engine.TryEvaluate("vlookup(array(array(1,2,3),array(2,3,4),array(3,4,5),array(4,5,6)),3,2)", 0);
1717
Assert.AreEqual(num, 4);
1818

19-
num = engine.TryEvaluate("vlookup({{1,'2',3},{2,'3',4},{3,'4',5},{4,'5',6}},3,2)", 0);
19+
num = engine.TryEvaluate("vlookup(array(array(1,'2',3),array(2,3,4),array(3,'4',5),array(4,'5',6)),3,2)", 0);
2020
Assert.AreEqual(num, 4);
2121

22-
num = engine.TryEvaluate("vlookup({{1,'2',3},{2,'3',4},{3,'4',5},{4,'5',6}},3.1,2)", 0);
22+
num = engine.TryEvaluate("vlookup(array(array(1,'2',3),array(2,3,4),array(3.1,'4',5),array(4,'5',6)),3.1,2)", 0);
2323
Assert.AreEqual(num, 4);
2424

25-
num = engine.TryEvaluate("vlookup({{1,'2',3},{2,'3',4},{'3a','4',5},{4,'5',6}},'3a',2)", 0);
25+
num = engine.TryEvaluate("vlookup(array(array(1,'2',3),array(2,3,4),array('3a','4',5),array(4,'5',6)),'3a',2)", 0);
2626
Assert.AreEqual(num, 4);
2727
}
2828
[Test]

csharp/ToolGood.Algorithm2.Test/Program.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ static void Main(string[] args)
1313
AlgorithmEngine engine = new AlgorithmEngine();
1414

1515
double t = 0.0;
16-
if (engine.Parse("1+2[][]")) {
17-
t = (double)engine.Evaluate().NumberValue;
18-
}
16+
//if (engine.Parse("1+2[][]")) {
17+
// t = (double)engine.Evaluate().NumberValue;
18+
//}
1919

2020
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
2121
Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");

csharp/ToolGood.Algorithm2.Test/ToolGood.Algorithm2.Test.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>netcoreapp3.1</TargetFramework>
5+
<TargetFramework>net6.0</TargetFramework>
66
</PropertyGroup>
77

88
<ItemGroup>

csharp/ToolGood.Algorithm2/AlgorithmEngine.cs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.IO;
44
using Antlr4.Runtime;
55
using Antlr4.Runtime.Misc;
6+
using ToolGood.Algorithm.Internals;
67
using ToolGood.Algorithm.LitJson;
78
using static mathParser;
89

@@ -297,17 +298,6 @@ public void AddParameterFromJson(string json)
297298
#endregion
298299

299300
#region Parse
300-
class AntlrErrorListener : IAntlrErrorListener<IToken>
301-
{
302-
public bool IsError { get; private set; }
303-
public string ErrorMsg { get; private set; }
304-
305-
public void SyntaxError(TextWriter output, IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
306-
{
307-
IsError = true;
308-
ErrorMsg = msg;
309-
}
310-
}
311301

312302
/// <summary>
313303
/// 编译公式,默认

0 commit comments

Comments
 (0)