⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 extcount.pas

📁 一个比较直接的表达式解析器
💻 PAS
字号:
说明:加、减、乘、除及括号;请大家多多测试
设计:Zswang
日期:2002-01-26
支持:wjhu111@21cn.com


///////代码开始
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 < 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 }
///////代码结束

///////示例开始
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := Calc(Edit2.Text);
end;
///////示例结束

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -