Skip to content

Commit 4c43404

Browse files
committed
1.3.3.3
1 parent 7421911 commit 4c43404

File tree

6 files changed

+194
-11
lines changed

6 files changed

+194
-11
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -827,6 +827,9 @@ ToolGood.Algorithm֧
827827
</tr>
828828
<tr>
829829
<td>json</td><td>json(文本)<br>动态json查询。</td> <td></td>
830+
</tr>
831+
<tr>
832+
<td>tryjson</td><td>tryjson(文本)<br>尝试转为json,再查询。</td> <td></td>
830833
</tr>
831834
<tr>
832835
<td>P<br>param</td><td>P(文本)<br>动态查询参数。</td> <td></td>

ToolGood.Algorithm.Test/AlgorithmEngine/AlgorithmEngineTest_csharp.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,8 @@ public void Json()
284284
dt = engine.TryEvaluate("json('{\"Name1\":\"William Shakespeare \",\"Age\":51,\"Birthday\":\"04/26/1564 00:00:00\"}').('Name'& 1).Trim().substring(2,3)", null);
285285
Assert.AreEqual(dt, "ill");
286286

287+
dt = engine.TryEvaluate("tryjson('12346{\"Name1\":\"William Shakespeare \",\"Age\":51,\"Birthday\":\"04/26/1564 00:00:00\"}').('Name'& 1).Trim().substring(2,3)", null);
288+
Assert.AreEqual(dt, "ill");
287289
}
288290
}
289291
}

ToolGood.Algorithm/AlgorithmEngine.cs

Lines changed: 167 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public AlgorithmEngine()
3939
AddCSharp();
4040
}
4141

42-
#region 可重写的方法
42+
#region protected
4343

4444
protected virtual Operand GetParameter(Operand curOpd)
4545
{
@@ -50,6 +50,11 @@ protected void AddFunction(string funName, Func<List<Operand>, Operand> function
5050
addFunc(funName, function);
5151
}
5252

53+
protected bool ContainsKey(string key)
54+
{
55+
return tokenDict.ContainsKey(key);
56+
}
57+
5358
#endregion
5459

5560
#region Parse
@@ -836,6 +841,167 @@ public TimeSpan TryEvaluate(string exp, TimeSpan def)
836841
return def;
837842
}
838843

844+
845+
public short TryEvaluate(string name, string exp, short def)
846+
{
847+
if (ContainsKey(name) || Parse(name, exp)) {
848+
try {
849+
var obj = Evaluate(name);
850+
if (obj is Date) return (short)(double)(Date)obj;
851+
return (short)(double)obj;
852+
} catch (Exception) { }
853+
}
854+
return def;
855+
}
856+
public int TryEvaluate(string name, string exp, int def)
857+
{
858+
if (ContainsKey(name) || Parse(name, exp)) {
859+
try {
860+
var obj = Evaluate(name);
861+
if (obj is Date) return (int)(double)(Date)Evaluate();
862+
return (int)(double)obj;
863+
} catch (Exception) { }
864+
}
865+
return def;
866+
}
867+
public long TryEvaluate(string name, string exp, long def)
868+
{
869+
if (ContainsKey(name) || Parse(name, exp)) {
870+
try {
871+
var obj = Evaluate(name);
872+
if (obj is Date) return (long)(double)(Date)obj;
873+
return (long)(double)obj;
874+
} catch (Exception) {
875+
}
876+
}
877+
return def;
878+
}
879+
880+
public ushort TryEvaluate(string name, string exp, ushort def)
881+
{
882+
if (ContainsKey(name) || Parse(name, exp)) {
883+
try {
884+
var obj = Evaluate(name);
885+
if (obj is Date) return (ushort)(double)(Date)obj;
886+
return (ushort)(double)obj;
887+
} catch (Exception) {
888+
}
889+
}
890+
return def;
891+
}
892+
public uint TryEvaluate(string name, string exp, uint def)
893+
{
894+
if (ContainsKey(name) || Parse(name, exp)) {
895+
try {
896+
var obj = Evaluate(name);
897+
if (obj is Date) return (uint)(double)(Date)obj;
898+
return (uint)(double)obj;
899+
} catch (Exception) {
900+
}
901+
}
902+
return def;
903+
}
904+
public ulong TryEvaluate(string name, string exp, ulong def)
905+
{
906+
if (ContainsKey(name) || Parse(name, exp)) {
907+
try {
908+
var obj = Evaluate(name);
909+
if (obj is Date) return (ulong)(double)(Date)obj;
910+
return (ulong)(double)obj;
911+
} catch (Exception) {
912+
}
913+
}
914+
return def;
915+
}
916+
917+
public float TryEvaluate(string name, string exp, float def)
918+
{
919+
if (ContainsKey(name) || Parse(name, exp)) {
920+
try {
921+
var obj = Evaluate(name);
922+
if (obj is Date) return (float)(double)(Date)obj;
923+
return (float)(double)obj;
924+
} catch (Exception) {
925+
}
926+
}
927+
return def;
928+
}
929+
public double TryEvaluate(string name, string exp, double def)
930+
{
931+
if (ContainsKey(name) || Parse(name, exp)) {
932+
try {
933+
var obj = Evaluate(name);
934+
if (obj is Date) return (double)(Date)obj;
935+
return (double)obj;
936+
} catch (Exception) {
937+
}
938+
}
939+
return def;
940+
}
941+
942+
public string TryEvaluate(string name, string exp, string def)
943+
{
944+
if (ContainsKey(name) || Parse(name, exp)) {
945+
try {
946+
return Evaluate(name).ToString();
947+
} catch (Exception) {
948+
}
949+
}
950+
return def;
951+
}
952+
public bool TryEvaluate(string name, string exp, bool def)
953+
{
954+
if (ContainsKey(name) || Parse(name, exp)) {
955+
try {
956+
var obj = Evaluate(name);
957+
if (obj is string) {
958+
return bool.Parse(obj.ToString());
959+
}
960+
if (obj is bool) {
961+
return (bool)obj;
962+
}
963+
if (obj is Date) return def;
964+
return decimal.Parse(obj.ToString()) != 0;
965+
} catch (Exception) {
966+
}
967+
}
968+
return def;
969+
}
970+
971+
public DateTime TryEvaluate(string name, string exp, DateTime def)
972+
{
973+
if (ContainsKey(name) || Parse(name, exp)) {
974+
try {
975+
var obj = Evaluate(name);
976+
if (obj is string) {
977+
if (DateTime.TryParse(obj.ToString(), out DateTime dt)) {
978+
return dt;
979+
}
980+
return def;
981+
}
982+
return (DateTime)(Date)Evaluate();
983+
} catch (Exception) { }
984+
}
985+
return def;
986+
}
987+
988+
public TimeSpan TryEvaluate(string name, string exp, TimeSpan def)
989+
{
990+
if (ContainsKey(name) || Parse(name, exp)) {
991+
try {
992+
var obj = Evaluate(name);
993+
if (obj is string) {
994+
if (TimeSpan.TryParse(obj.ToString(), out TimeSpan dt)) {
995+
return dt;
996+
}
997+
return def;
998+
}
999+
return (TimeSpan)(Date)Evaluate();
1000+
} catch (Exception) {
1001+
}
1002+
}
1003+
return def;
1004+
}
8391005
#endregion
8401006

8411007
private void addFunc(string name, Func<List<Operand>, Operand> func)
@@ -845,7 +1011,6 @@ private void addFunc(string name, Func<List<Operand>, Operand> func)
8451011
funcDict[name] = func;
8461012
}
8471013

848-
8491014
private Operand doFunc(Operator curOpt, List<Operand> ops)
8501015
{
8511016
try {

ToolGood.Algorithm/AlgorithmEngine.csharp.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Collections.Generic;
44
using System.Linq;
55
using System.Text;
6+
using System.Text.RegularExpressions;
67
using System.Web;
78
using ToolGood.Algorithm.LitJson;
89

@@ -67,7 +68,19 @@ private void AddCSharp()
6768
addFunc("P", F_P);
6869
addFunc("param", F_P);
6970
addFunc("json", F_Json);
71+
addFunc("Tryjson", F_TryJson);
7072
}
73+
private Operand F_TryJson(List<Operand> arg)
74+
{
75+
CheckArgsCount("TryJson", arg, new OperandType[][] { new OperandType[] { OperandType.STRING } });
76+
var match = Regex.Match(arg[0].StringValue, @"\{.*\}|\[.*\]");
77+
if (match.Success) {
78+
var json = JsonMapper.ToObject(match.Value);
79+
return new Operand(OperandType.JSON, json);
80+
}
81+
return new Operand(OperandType.ERROR, "无法转Json格式!");
82+
}
83+
7184
private Operand F_Json(List<Operand> arg)
7285
{
7386
CheckArgsCount("Json", arg, new OperandType[][] { new OperandType[] { OperandType.STRING } });

ToolGood.Algorithm/ToolGood.Algorithm.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@
2323
<RootNamespace>ToolGood.Algorithm</RootNamespace>
2424
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
2525
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
26-
<FileVersion>1.3.3.2</FileVersion>
27-
<Version>1.3.3.2</Version>
26+
<FileVersion>1.3.3.3</FileVersion>
27+
<Version>1.3.3.3</Version>
2828
<PackageReleaseNotes></PackageReleaseNotes>
2929
<Product>ToolGood.Algorithm</Product>
30-
<AssemblyVersion>1.3.3.2</AssemblyVersion>
30+
<AssemblyVersion>1.3.3.3</AssemblyVersion>
3131
</PropertyGroup>
3232

3333
<ItemGroup Condition=" '$(TargetFramework)' == 'net40' ">

ToolGood.Algorithm/_base/Operand.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -143,16 +143,16 @@ public string Parameter {
143143
}
144144
}
145145

146-
internal double NumberValue {
146+
public double NumberValue {
147147
get {
148148
if (Type == OperandType.BOOLEAN) {
149149
return (bool)Value ? 1 : 0;
150150
}
151151
return (double)Value;
152152
}
153153
}
154-
internal string StringValue { get { return Value.ToString(); } }
155-
internal bool BooleanValue {
154+
public string StringValue { get { return Value.ToString(); } }
155+
public bool BooleanValue {
156156
get {
157157
if (Type == OperandType.NUMBER) {
158158
if (Value is double) {
@@ -164,10 +164,10 @@ internal bool BooleanValue {
164164
}
165165
}
166166
internal Date DateValue { get { return (Date)Value; } }
167-
internal int IntValue { get { return (int)(double)Value; } }
167+
public int IntValue { get { return (int)(double)Value; } }
168168

169169

170-
internal List<double> GetNumberList()
170+
public List<double> GetNumberList()
171171
{
172172
if (Type == OperandType.NUMBER) {
173173
return new List<double>() { this.NumberValue };
@@ -183,7 +183,7 @@ internal List<double> GetNumberList()
183183
}
184184
return list;
185185
}
186-
internal List<Operand> GetValueList()
186+
public List<Operand> GetValueList()
187187
{
188188
List<Operand> list = new List<Operand>();
189189
if (Value is List<Operand>) {

0 commit comments

Comments
 (0)