首页  编辑  

计算表达式

Tags: /超级猛料/Friends.网友专栏/zswang/函数大全/   Date Created:

ZsWang

// 完整代码

uses

 Math;

procedure Bracket(mText: string; var nLStr, nCStr, nRStr: string);

var

 L, R: Integer;

 I: Integer;

 B: Boolean;

begin

 nLStr := '';

 nCStr := '';

 nRStr := '';

 B := True;

 L := 0;

 R := 0;

 for I := 1 to Length(mText) do

   if B then begin

     if mText[I] = '(' then

       Inc(L)

     else if mText[I] = ')' then

       Inc(R);

     if L = 0 then

       nLStr := nLStr + mText[I]

     else if L > R then

       nCStr := nCStr + mText[I]

     else B := False;

   end else nRStr := nRStr + mText[I];

 Delete(nCStr, 1, 1);

end; { Bracket }

function Calc(mText: string): string;

var

 vText: string;

 function fCalc(mText: string): string;

 var

   vLStr, vCStr, vRStr: string;

   I, J, K, L: Integer;

 begin

   L := Length(mText);

   if Pos('(', mText) > 0 then begin

     Bracket(mText, vLStr, vCStr, vRStr);

     Result := fCalc(vLStr + fCalc(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 := L;

     if J = 0 then J := L;

     K := Min(I, J);

     vLStr := Copy(mText, 1, Pred(K));

     vRStr := Copy(mText, Succ(K), L);

     if vLStr = '' then vLStr := '0';

     if vRStr = '' then vRStr := '0';

     if I = K then

       Result := FloatToStr(StrToFloat(fCalc(vLStr)) + StrToFloat(fCalc(vRStr)))

     else Result := FloatToStr(StrToFloat(fCalc(vLStr)) - StrToFloat(fCalc(vRStr)))

   end else if (Pos('*', mText) > 0) or (Pos('/', mText) > 0) then begin

     I := Pos('*', mText);

     J := Pos('/', mText);

     if I = 0 then I := L;

     if J = 0 then J := L;

     K := Min(I, J);

     vLStr := Copy(mText, 1, Pred(K));

     vRStr := Copy(mText, Succ(K), L);

     if vLStr = '' then vLStr := '0';

     if vRStr = '' then vRStr := '0';

     if I = K then

       Result := FloatToStr(StrToFloat(fCalc(vLStr)) * StrToFloat(fCalc(vRStr)))

     else Result := FloatToStr(StrToFloat(fCalc(vLStr)) / StrToFloat(fCalc(vRStr)))

   end else if Pos('_', mText) = 1 then

     Result := FloatToStr(-StrToFloat(fCalc(Copy(mText, 2, L))))

   else Result := FloatToStr(StrToFloat(mText));

 end;

var

 I, L: Integer;

begin

 vText := '';

 L := Length(mText);

 for I := 1 to L do

   if (mText[I] = '-') and (I < L) and (not (mText[Succ(I)] in ['+', '-', '(', ')'])) then

     if (I = 1) or ((I > 1) and (mText[Pred(I)] in ['*', '/'])) then

       vText := vText + '_'

     else if ((I > 1) and (mText[Pred(I)] in ['+', '-'])) or

       ((I > 1) and (mText[Pred(I)] = ')') and (I < L) and

       (not (mText[Succ(I)] in ['+', '-', '(', ')']))) then

       vText := vText + '+_'

     else vText := vText + mText[I]

   else vText := vText + mText[I];

 Result := fCalc(vText);

end; { Calc }