提问前请先搜索。回复人: li_zhifu(东北人) (  ) 信誉:100  2002-2-16 20:02:45  得分:0  
唉,你们都是怎么了,这个问题M$已经有了一个解决方案了。在Win2K下在Delphi中Import  ActiveX Control,选Microsoft  Script  Control 1.0,安装,在应用程序中 
ScriptControl1.Language:='JavaScript'; 
ShowMessage(ScriptControl1.Eval('2*3+5')); 
就可以了。 
在Win98中可以把Win2K下的msscript.ocx拷过来用。 
此控件可以进行复杂的运算,如支持'(',组合运算等。甚至可以对整型数进行位运算。

解决方案 »

  1.   

    http://www.csdn.net/expert/topic/762/762197.xml?temp=9.559268E-02
      

  2.   

    function sum(Value:String):string;
    const
      a = '+';
      b = '-';
      c = '*';
      d = '/';
      ea= '(';
      eb= ')';
      function GetToken(Value:String):String;
      var
        P1,P2:Integer;
      begin
        Result := '';
        P1 := Pos(ea,Value);
        if P1 <> 0 then
        begin
          P2 := Pos(eb,Value);
          Result := Copy(Value,P1+1,P2-P1-1);
        end;
      end;
      function GetResult(Value:String):String;
      var
        P1,P2,P3,P4,i,nStart,nEnd,P:Integer;
        N1,N2 : Real;
        Tmp : String;
        IsFuShu : Boolean;
      begin
        IsFuShu := False;
        N1 := 0;
        N2 := 0;
        P  := 0;
        P1 := Pos(c,Value);
        P2 := Pos(d,Value);
        P3 := Pos(a,Value);
        P4 := Pos(b,Value);
        while (P1<>0)or(P2<>0)or(P3<>0)or(P4<>0) do
        begin
          if (P3<>0) and (P4=0) then
            P := P3;
          if (P3=0)  and (P4<>0)then
            P := P4;
          if (P3<>0) and (P4<>0) and (P4>P3) then
            P := P3;
          if (P3<>0) and (P4<>0) and (P4<P3) then
            P := P4;
          if (P1<>0) and (P2=0) then
            P := P1;
          if (P1 =0) and (P2<>0)then
            P := P2;
          if (P1<>0) and (P2<>0) and (P2>P1) then
            P := P1;
          if (P1<>0) and (P2<>0) and (P1>P2) then
            P := P2;
          if P <> 0 then
          begin
            for i := P-1 downto 1 do
            begin
              if (Value[i]=a)or(Value[i]=b)or(Value[i]=c)
              or(Value[i]=d)or(Value[i]=ea)or(i=1) then
              begin
                if i<>1 then
                  N1 := StrToFloat(Copy(Value,i+1,P-i-1))
                else
                N1 := StrToFloat(Copy(Value,1,P-1));
                  Break;
              end;
            end;
            if i<>1 then
              nStart := i+1
            else nStart := 1;
            for i := P+1 to Length(Value) do
            begin
              if (Value[i]=a)or(Value[i]=b)or(Value[i]=c)
              or(Value[i]=d)or(Value[i]=eb)or(i=Length(Value)) then
              begin
                if i<>Length(Value) then
                   N2 := StrToFloat(Copy(Value,P+1,i-P-1))
                else
                  N2 := StrToFloat(Copy(Value,P+1,i));
                Break;
              end;
            end;
            if i=Length(Value) then
            nEnd := i+1
            else
              nEnd := i;
            if P=P1 then
              Tmp := FloatToStr(N1*N2);
            if P=P2 then
              Tmp := FloatToStr(N1 / N2);
            if P=P3 then
              Tmp := FloatToStr(N1+N2);
            if P=P4 then
            begin
              if N1<N2 then
              begin
                IsFuShu := Not IsFuShu;
                Tmp := FloatToStr(N2-N1);
              end;
              if N1>N2 then
                Tmp := FloatToStr(N1-N2);
            end;
            if nEnd <> 1 then
              Delete(Value,nStart,nEnd-nStart)
            else
              Delete(Value,nStart,nEnd);
            Insert(Tmp,Value,nStart);
        end;
        P1 := Pos(c,Value);
        P2 := Pos(d,Value);
        P3 := Pos(a,Value);
        P4 := Pos(b,Value);
        end;
        if IsFuShu then
          Result := '-'+Value
        else
          Result := Value;
      end;
    var
      S : String;
      P1,P2 : Integer;
    begin
      P1 := Pos(ea,Value);
      P2 := Pos(eb,Value);
      while GetToken(Value) <> '' do
      begin
        P1 := Pos(ea,Value);
        P2 := Pos(eb,Value);
        S:=GetToken(Value);
        S:=GetResult(S);
        Delete(Value,P1,P2-P1+1);
        Insert(S,Value,P1);
      end;
      Result := GetResult(Value);
    end;
    怎么这么多的人要做这样的东西呀?
    S为你要计算的字符串
    用Edit1.Text:=sum(S);
    Edit1.Text就是计算结果
    你要把结果转为整形的就用StrToInt(..)来转换吧。
      

  3.   

    提问前请先搜索。回复人: li_zhifu(东北人) (  ) 信誉:100  2002-2-16 20:02:45  得分:0  
    唉,你们都是怎么了,这个问题M$已经有了一个解决方案了。在Win2K下在Delphi中Import  ActiveX Control,选Microsoft  Script  Control 1.0,安装,在应用程序中 
    ScriptControl1.Language:='JavaScript'; 
    ShowMessage(ScriptControl1.Eval('2*3+5')); 
    就可以了。 
    在Win98中可以把Win2K下的msscript.ocx拷过来用。 
    此控件可以进行复杂的运算,如支持'(',组合运算等。甚至可以对整型数进行位运算。