以后提问前请先搜索。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.   

    转成数值再算
    StrToInt
    StrToFloat
      

  2.   

    var
      vScript: Variant;
    ...
      vScript := CreateOleObject('ScriptControl');
      vScript.Language := 'JavaScript';
      ShowMessage(vScript.Eval('1000+300+129-((1000/30)*3+58.5)'));
      

  3.   

    //==============================================================================
    //计算表达式(输入:3*(6+5)-7,输出:26)***************************************
    //==============================================================================
    function Calculate(Expression: string): string;
    var vText: string;
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      function Reckon(mText: string): string;
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        procedure Bracket(mText: string; var nLStr, nCStr, nRStr: string);
        var i, CountLeft, CountRight: Integer;
            Bool: Boolean;
        begin
          nLStr := '';
          nCStr := '';
          nRStr := '';
          CountLeft := 0;
          CountRight := 0;
          Bool := true;
          //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          for i := 1 to Length(mText) do
            if Bool then
            begin
              if mText[i] = '(' then Inc(CountLeft)
              else if mText[i] = ')' then Inc(CountRight);
              //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
              if CountLeft = 0 then nLStr := nLStr + mText[i]
              else if CountLeft > CountRight then nCStr := nCStr + mText[i]
              else Bool := false;
            end else nRStr := nRStr + mText[i];
            //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          Delete(nCStr, 1, 1);
        end; { Bracket }
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      var vLStr, vCStr, vRStr: string;
          i, j, k, mTextLength: Integer;
      begin
        mTextLength := Length(mText);
        if Pos('(', mText) > 0
        then begin
               Bracket(mText, vLStr, vCStr, vRStr);
               Result := Reckon(vLStr + Reckon(vCStr) + vRStr);
             end
        else if (Pos('+', mText) > 0) or (Pos('-', mText) > 0)
        then begin
               i := Pos('+', mText);
               j := Pos('-', mText);
               if i = 0 then i := mTextLength;
               if j = 0 then j := mTextLength;
               k := Min(i, j);
               vLStr := Copy(mText, 1, Pred(k));
               vRStr := Copy(mText, Succ(k), mTextLength);
               if vLStr = '' then vLStr := '0';
               if vRStr = '' then vRStr := '0';
               if i = k
               then Result := FloatToStr(StrToFloat(Reckon(vLStr)) + StrToFloat(Reckon(vRStr)))
               else Result := FloatToStr(StrToFloat(Reckon(vLStr)) - StrToFloat(Reckon(vRStr)))
             end
        else if (Pos('*', mText) > 0) or (Pos('/', mText) > 0)
        then begin
               i := Pos('*', mText);
               j := Pos('/', mText);
               if i = 0 then i := mTextLength;
               if j = 0 then j := mTextLength;
               k := Min(i, j);
               vLStr := Copy(mText, 1, Pred(k));
               vRStr := Copy(mText, Succ(k), mTextLength);
               if vLStr = '' then vLStr := '0';
               if vRStr = '' then vRStr := '0';
               if i = k
               then Result := FloatToStr(StrToFloat(Reckon(vLStr)) * StrToFloat(Reckon(vRStr)))
               else Result := FloatToStr(StrToFloat(Reckon(vLStr)) / StrToFloat(Reckon(vRStr)))
             end
        else if Pos('_', mText) = 1
        then Result := FloatToStr(-StrToFloat(Reckon(Copy(mText, 2, mTextLength))))
        else Result := FloatToStr(StrToFloat(mText));
      end;
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    var i, ExpLength: integer;
    begin
      vText := '';
      ExpLength := Length(Expression);
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      for i := 1 to ExpLength do
        if (Expression[i] = '-') and (i < ExpLength) and (not (Expression[Succ(i)] in ['+', '-', '(', ')']))
        then if (i = 1) or ((i > 1) and (Expression[Pred(i)] in ['*', '/']))
             then vText := vText + '_'
             else if ((i > 1) and (Expression[Pred(i)] in ['+', '-'])) or ((i < ExpLength) and (not (Expression[Succ(i)] in ['+', '-', '(', ')'])))
             then vText := vText + '+_'
             else vText := vText + Expression[i]
        else vText := vText + Expression[i];
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      Result := Reckon(vText);
    end;