Delphi 2009 引入 Character 單元,提供 Unicode 感知的字符分類函數。本文詳細講解 IsLetter、IsUpper、IsLower、IsDigit、IsNumber 的判定範圍、重載形式與實測結果。
| 函數 | 判定內容 | 核心範圍 | 備註 |
|---|---|---|---|
| IsLetter | 是否字母 | A-Z, a-z | 含 Unicode 字母 |
| IsUpper | 是否大寫字母 | A-Z | 含 Unicode 大寫 |
| IsLower | 是否小寫字母 | a-z | 含 Unicode 小寫 |
| IsDigit | 是否十進制數字 | 0-9 | 僅 ASCII 數字 |
| IsNumber | 是否數字符號 | 0-9 + ¹²³¼½¾ 等 | 含上標/分數符號 |
function IsXxx(C: Char): Boolean; // 單字符判定
function IsXxx(const S: string; Index: Integer): Boolean; // 字符串指定位置判定 (1-based)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton; // IsLetter
Button2: TButton; // IsUpper
Button3: TButton; // IsLower
Button4: TButton; // IsDigit
Button5: TButton; // IsNumber
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses Character;
{ IsLetter: 是否字母 }
procedure TForm1.Button1Click(Sender: TObject);
var b1,b2,b3: Boolean;
begin
b1 := IsLetter('A'); // True
b2 := IsLetter('a'); // True
b3 := IsLetter('9'); // False
ShowMessageFmt('%s,%s,%s', [BoolToStr(b1,True), BoolToStr(b2,True), BoolToStr(b3,True)]);
// True,True,False
b1 := IsLetter('D2009', 1); // 'D' -> True
b2 := IsLetter('D2009', 2); // '2' -> False
ShowMessageFmt('%s,%s', [BoolToStr(b1,True), BoolToStr(b2,True)]);
// True,False
end;
{ IsUpper: 是否大寫字母 }
procedure TForm1.Button2Click(Sender: TObject);
var b1,b2,b3: Boolean;
begin
b1 := IsUpper('A'); // True
b2 := IsUpper('a'); // False
b3 := IsUpper('9'); // False
ShowMessageFmt('%s,%s,%s', [BoolToStr(b1,True), BoolToStr(b2,True), BoolToStr(b3,True)]);
// True,False,False
b1 := IsUpper('Delphi', 1); // 'D' -> True
b2 := IsUpper('Delphi', 2); // 'e' -> False
ShowMessageFmt('%s,%s', [BoolToStr(b1,True), BoolToStr(b2,True)]);
// True,False
end;
{ IsLower: 是否小寫字母 }
procedure TForm1.Button3Click(Sender: TObject);
var b1,b2,b3: Boolean;
begin
b1 := IsLower('A'); // False
b2 := IsLower('a'); // True
b3 := IsLower('9'); // False
ShowMessageFmt('%s,%s,%s', [BoolToStr(b1,True), BoolToStr(b2,True), BoolToStr(b3,True)]);
// False,True,False
b1 := IsLower('Delphi', 1); // 'D' -> False
b2 := IsLower('Delphi', 2); // 'e' -> True
ShowMessageFmt('%s,%s', [BoolToStr(b1,True), BoolToStr(b2,True)]);
// False,True
end;
{ IsDigit: 是否十進制數字 }
procedure TForm1.Button4Click(Sender: TObject);
var b1,b2,b3: Boolean;
begin
b1 := IsDigit('A'); // False
b2 := IsDigit('½'); // False (分數非十進制)
b3 := IsDigit('9'); // True
ShowMessageFmt('%s,%s,%s', [BoolToStr(b1,True), BoolToStr(b2,True), BoolToStr(b3,True)]);
// False,False,True
b1 := IsDigit('D2009', 1); // 'D' -> False
b2 := IsDigit('D2009', 2); // '2' -> True
ShowMessageFmt('%s,%s', [BoolToStr(b1,True), BoolToStr(b2,True)]);
// False,True
end;
{ IsNumber: 是否數字符號 (範圍最廣) }
procedure TForm1.Button5Click(Sender: TObject);
var b1,b2,b3: Boolean;
begin
b1 := IsNumber('A'); // False
b2 := IsNumber('½'); // True (分數符號)
b3 := IsNumber('9'); // True
ShowMessageFmt('%s,%s,%s', [BoolToStr(b1,True), BoolToStr(b2,True), BoolToStr(b3,True)]);
// False,True,True
b1 := IsNumber('123¹²³¼½¾', 1); // '1' -> True
b2 := IsNumber('123¹²³¼½¾', 4); // '¹' -> True
ShowMessageFmt('%s,%s', [BoolToStr(b1,True), BoolToStr(b2,True)]);
// True,True
end;
end.
| 字符 | IsDigit | IsNumber | 說明 |
|---|---|---|---|
| 0-9 | True | True | 標準數字 |
| ¹ ² ³ (上標) | False | True | Unicode 數字符號 |
| ¼ ½ ¾ (分數) | False | True | 通用數字符號 |
| ① ② ③ (圈數) | False | True | 帶圈數字 |
| 中文數字 一二三 | False | True* | 視 Unicode 版本而定 |
* 實測中文數字在某些 Delphi 版本中 IsNumber 返回 True,建議實測確認。
SysUtils 函數 (如 IsAlpha) 僅支持 ANSI/當前代碼頁Character 單元函數基於 **Unicode 標準屬性**,正確處理多語言字符IsXxx(S, Index) 內部調用 S[Index],注意 1-based 索引Character 單元為 Delphi 2009+ 帶來真正的 Unicode 級字符分類能力,是現代文本處理的標準工具箱。