計算字串形式的數學運算式 (如 "3.14 * (5 + 2) / 2") 是常見需求。本文展示一種巧思:利用 Microsoft Jet OLE DB Provider 對 dBASE 檔案的 SQL 查詢能力,零解析器實作即可支援四則運算、邏輯運算、數學函數 (SIN、COS 等) 及字串函數。並深入探討 Delphi 兩大例外處理模式 try...except 與 try...finally 的適用場景。
function CalcExpr(const Expr: string): string;
var
Query: TADODataSet;
begin
Query := TADODataSet.Create(nil);
try
// 使用 Jet OLE DB Provider 的 dBASE 驅動
Query.ConnectionString :=
'Provider=MSDASQL.1;Persist Security Info=False;' +
'Data Source=dBASE Files';
// SQL 查詢直接計算運算式
Query.CommandText := 'SELECT ' + Expr + ' AS Result';
Query.Open;
Result := Expr + ' = ' + Query.FieldByName('Result').AsString;
finally
Query.Free; // 確保資源釋放
end;
end;
procedure TfrmCalc.Button1Click(Sender: TObject);
begin
try
Edit1.Text := CalcExpr(Edit1.Text);
except
on E: Exception do
ShowMessage('計算錯誤:' + E.Message);
end;
end;
procedure TfrmCalc.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then Button1Click(Self);
end;
| 類別 | 範例 | |
|---|---|---|
| 算術 | +、-、*、/、\ (整除)、MOD | |
| 邏輯 | AND、OR、XOR、NOT | |
| 比較 | =、<>、<、>、<=、>= | |
| 數學 | ABS、SQR、SIN、COS、TAN、ATN、EXP、LOG、SGN、SQR | |
| 字串 | LEFT、RIGHT、MID、LEN、TRIM、UCASE、LCASE | |
| 轉換 | CINT、CLNG、CSNG、CDBL、CSTR、CBOOL |
| 優點 | 缺點 | 適用場景 |
|---|---|---|
| 零程式碼解析器,支援豐富函數 | 需安裝 Jet/ACE Provider;效能不如原生解析器 | 原型開發、腳本引擎、報表運算式、教學示範 |
直接拼接使用者輸入至 SQL 存在注入風險 (雖 Jet SQL 無預存程序參數化支援)。生產環境建議:
1. 先以正規表示式驗證運算式只含允許字元。
2. 或改用專用運算式解析庫 (如 TExpressionParser、mXparser Pascal 移植版)。