@@ -51,7 +51,11 @@ protected void AddFunction(string funName, Func<List<Operand>, Operand> function
5151 #endregion
5252
5353 #region Parse
54-
54+ /// <summary>
55+ /// 编译公式,默认
56+ /// </summary>
57+ /// <param name="exp">公式</param>
58+ /// <returns></returns>
5559 public bool Parse ( string exp )
5660 {
5761 if ( string . IsNullOrEmpty ( exp ) || exp . Trim ( ) == "" || ! this . isMatching ( exp ) ) {
@@ -62,7 +66,13 @@ public bool Parse(string exp)
6266 m_tokens = parse ( exp , out error ) ;
6367 return true ;
6468 }
65- public bool Parse ( string exp , out string error )
69+ /// <summary>
70+ /// 编译公式,并输出错误,默认
71+ /// </summary>
72+ /// <param name="exp">公式</param>
73+ /// <param name="error">输出错误</param>
74+ /// <returns></returns>
75+ public bool Parse ( string exp , out string error )
6676 {
6777 if ( string . IsNullOrEmpty ( exp ) || exp . Trim ( ) == "" || ! this . isMatching ( exp ) ) {
6878 error = "exp无效" ;
@@ -72,18 +82,30 @@ public bool Parse(string exp ,out string error)
7282 m_tokens = parse ( exp , out error ) ;
7383 return true ;
7484 }
75-
85+ /// <summary>
86+ /// 编译公式
87+ /// </summary>
88+ /// <param name="name">名称</param>
89+ /// <param name="exp">公式</param>
90+ /// <returns></returns>
7691 public bool Parse ( string name , string exp )
7792 {
7893 if ( string . IsNullOrEmpty ( exp ) || exp . Trim ( ) == "" || ! this . isMatching ( exp ) ) {
7994 LastError = "exp无效" ;
8095 return false ;
8196 }
8297 string error ;
83- tokenDict [ name ] = parse ( exp , out error ) ;
98+ tokenDict [ name ] = parse ( exp , out error ) ;
8499 LastError = error ;
85100 return true ;
86101 }
102+ /// <summary>
103+ /// 编译公式,并输出错误
104+ /// </summary>
105+ /// <param name="name">名称</param>
106+ /// <param name="exp">公式</param>
107+ /// <param name="error">输出错误</param>
108+ /// <returns></returns>
87109 public bool Parse ( string name , string exp , out string error )
88110 {
89111 if ( string . IsNullOrEmpty ( exp ) || exp . Trim ( ) == "" || ! this . isMatching ( exp ) ) {
@@ -97,7 +119,7 @@ public bool Parse(string name, string exp, out string error)
97119 }
98120
99121
100- private Stack < object > parse ( string exp , out string error )
122+ private Stack < object > parse ( string exp , out string error )
101123 {
102124 error = null ;
103125 var tmp = parse ( exp ) ;
@@ -396,12 +418,16 @@ private List<string> splitText(string exp)
396418 #endregion
397419
398420 #region GetParameterNames
399-
421+ /// <summary>
422+ /// 获取所有参数名称
423+ /// </summary>
424+ /// <returns></returns>
400425 public List < string > GetParameterNames ( )
401426 {
402427 return GetParameterNames ( m_tokens ) ;
403428 }
404- private List < string > GetParameterNames ( Stack < object > tokens )
429+
430+ private List < string > GetParameterNames ( Stack < object > tokens )
405431 {
406432 List < string > list = new List < string > ( ) ;
407433 foreach ( var item in tokens ) {
@@ -420,19 +446,32 @@ private List<string> GetParameterNames(Stack<object> tokens )
420446 #endregion
421447
422448 #region Evaluate
449+ /// <summary>
450+ /// 执行,默认
451+ /// </summary>
452+ /// <returns></returns>
423453 public object Evaluate ( )
424454 {
425- if ( m_tokens . Count == 0 ) return null ;
455+ if ( m_tokens . Count == 0 ) {
456+ LastError = "请编译公式!" ;
457+ throw new Exception ( "请编译公式!" ) ;
458+ }
426459 return evaluate ( m_tokens ) ;
427460 }
428461
462+ /// <summary>
463+ /// 执行
464+ /// </summary>
465+ /// <param name="name">名称</param>
466+ /// <returns></returns>
429467 public object Evaluate ( string name )
430468 {
431469 Stack < object > tokens = null ;
432470 if ( tokenDict . TryGetValue ( name , out tokens ) ) {
433471 return evaluate ( tokens ) ;
434472 }
435- return null ;
473+ LastError = "请编译公式!" ;
474+ throw new Exception ( "请编译公式!" ) ;
436475 }
437476
438477 private object evaluate ( Stack < object > tokens )
@@ -559,121 +598,162 @@ private object evaluate(Stack<object> tokens)
559598 public short TryEvaluate ( string exp , short def )
560599 {
561600 if ( Parse ( exp ) ) {
562- var obj = Evaluate ( ) ;
563- if ( obj is Date ) return ( short ) ( double ) ( Date ) obj ;
564- return ( short ) ( double ) obj ;
601+ try {
602+ var obj = Evaluate ( ) ;
603+ if ( obj is Date ) return ( short ) ( double ) ( Date ) obj ;
604+ return ( short ) ( double ) obj ;
605+ } catch ( Exception ) { }
565606 }
566607 return def ;
567608 }
568609 public int TryEvaluate ( string exp , int def )
569610 {
570611 if ( Parse ( exp ) ) {
571- var obj = Evaluate ( ) ;
572- if ( obj is Date ) return ( int ) ( double ) ( Date ) Evaluate ( ) ;
573- return ( int ) ( double ) obj ;
612+ try {
613+ var obj = Evaluate ( ) ;
614+ if ( obj is Date ) return ( int ) ( double ) ( Date ) Evaluate ( ) ;
615+ return ( int ) ( double ) obj ;
616+ } catch ( Exception ) { }
574617 }
575618 return def ;
576619 }
577620 public long TryEvaluate ( string exp , long def )
578621 {
579622 if ( Parse ( exp ) ) {
580- var obj = Evaluate ( ) ;
581- if ( obj is Date ) return ( long ) ( double ) ( Date ) obj ;
582- return ( long ) ( double ) obj ;
623+ try {
624+ var obj = Evaluate ( ) ;
625+ if ( obj is Date ) return ( long ) ( double ) ( Date ) obj ;
626+ return ( long ) ( double ) obj ;
627+ } catch ( Exception ) {
628+ }
583629 }
584630 return def ;
585631 }
586632
587633 public ushort TryEvaluate ( string exp , ushort def )
588634 {
589635 if ( Parse ( exp ) ) {
590- var obj = Evaluate ( ) ;
591- if ( obj is Date ) return ( ushort ) ( double ) ( Date ) obj ;
592- return ( ushort ) ( double ) obj ;
636+ try {
637+ var obj = Evaluate ( ) ;
638+ if ( obj is Date ) return ( ushort ) ( double ) ( Date ) obj ;
639+ return ( ushort ) ( double ) obj ;
640+ } catch ( Exception ) {
641+ }
593642 }
594643 return def ;
595644 }
596645 public uint TryEvaluate ( string exp , uint def )
597646 {
598647 if ( Parse ( exp ) ) {
599- var obj = Evaluate ( ) ;
600- if ( obj is Date ) return ( uint ) ( double ) ( Date ) obj ;
601- return ( uint ) ( double ) obj ;
648+ try {
649+ var obj = Evaluate ( ) ;
650+ if ( obj is Date ) return ( uint ) ( double ) ( Date ) obj ;
651+ return ( uint ) ( double ) obj ;
652+ } catch ( Exception ) {
653+ }
602654 }
603655 return def ;
604656 }
605657 public ulong TryEvaluate ( string exp , ulong def )
606658 {
607659 if ( Parse ( exp ) ) {
608- var obj = Evaluate ( ) ;
609- if ( obj is Date ) return ( ulong ) ( double ) ( Date ) obj ;
610- return ( ulong ) ( double ) obj ;
660+ try {
661+ var obj = Evaluate ( ) ;
662+ if ( obj is Date ) return ( ulong ) ( double ) ( Date ) obj ;
663+ return ( ulong ) ( double ) obj ;
664+ } catch ( Exception ) {
665+ }
611666 }
612667 return def ;
613668 }
614669
615670 public float TryEvaluate ( string exp , float def )
616671 {
617672 if ( Parse ( exp ) ) {
618- var obj = Evaluate ( ) ;
619- if ( obj is Date ) return ( float ) ( double ) ( Date ) obj ;
620- return ( float ) ( double ) obj ;
673+ try {
674+ var obj = Evaluate ( ) ;
675+ if ( obj is Date ) return ( float ) ( double ) ( Date ) obj ;
676+ return ( float ) ( double ) obj ;
677+ } catch ( Exception ) {
678+ }
621679 }
622680 return def ;
623681 }
624682 public double TryEvaluate ( string exp , double def )
625683 {
626684 if ( Parse ( exp ) ) {
627- var obj = Evaluate ( ) ;
628- if ( obj is Date ) return ( double ) ( Date ) obj ;
629- return ( double ) obj ;
685+ try {
686+ var obj = Evaluate ( ) ;
687+ if ( obj is Date ) return ( double ) ( Date ) obj ;
688+ return ( double ) obj ;
689+ } catch ( Exception ) {
690+ }
630691 }
631692 return def ;
632693 }
633694
634695 public string TryEvaluate ( string exp , string def )
635696 {
636697 if ( Parse ( exp ) ) {
637- return Evaluate ( ) . ToString ( ) ;
698+ try {
699+ return Evaluate ( ) . ToString ( ) ;
700+ } catch ( Exception ) {
701+ }
638702 }
639703 return def ;
640704 }
641705 public bool TryEvaluate ( string exp , bool def )
642706 {
643707 if ( Parse ( exp ) ) {
644- return ( bool ) Evaluate ( ) ;
708+ try {
709+ var obj = Evaluate ( ) ;
710+ if ( obj is string ) {
711+ return bool . Parse ( obj . ToString ( ) ) ;
712+ }
713+ if ( obj is bool ) {
714+ return ( bool ) obj ;
715+ }
716+ if ( obj is Date ) return def ;
717+ return decimal . Parse ( obj . ToString ( ) ) != 0 ;
718+ } catch ( Exception ) {
719+ }
645720 }
646721 return def ;
647722 }
648723
649724 public DateTime TryEvaluate ( string exp , DateTime def )
650725 {
651726 if ( Parse ( exp ) ) {
652- var obj = Evaluate ( ) ;
653- if ( obj is string ) {
654- DateTime dt ;
655- if ( DateTime . TryParse ( obj . ToString ( ) , out dt ) ) {
656- return dt ;
727+ try {
728+ var obj = Evaluate ( ) ;
729+ if ( obj is string ) {
730+ DateTime dt ;
731+ if ( DateTime . TryParse ( obj . ToString ( ) , out dt ) ) {
732+ return dt ;
733+ }
734+ return def ;
657735 }
658- return def ;
659- }
660- return ( DateTime ) ( Date ) Evaluate ( ) ;
736+ return ( DateTime ) ( Date ) Evaluate ( ) ;
737+ } catch ( Exception ) { }
661738 }
662739 return def ;
663740 }
664741
665742 public TimeSpan TryEvaluate ( string exp , TimeSpan def )
666743 {
667744 if ( Parse ( exp ) ) {
668- var obj = Evaluate ( ) ;
669- if ( obj is string ) {
670- TimeSpan dt ;
671- if ( TimeSpan . TryParse ( obj . ToString ( ) , out dt ) ) {
672- return dt ;
745+ try {
746+ var obj = Evaluate ( ) ;
747+ if ( obj is string ) {
748+ TimeSpan dt ;
749+ if ( TimeSpan . TryParse ( obj . ToString ( ) , out dt ) ) {
750+ return dt ;
751+ }
752+ return def ;
673753 }
674- return def ;
754+ return ( TimeSpan ) ( Date ) Evaluate ( ) ;
755+ } catch ( Exception ) {
675756 }
676- return ( TimeSpan ) ( Date ) Evaluate ( ) ;
677757 }
678758 return def ;
679759 }
0 commit comments