Delphi 2009 全面支援 Unicode,Character 單元提供豐富的字元分類與轉換靜態方法,取代傳統手寫判斷邏輯,正確處理多語言字元。本文詳細解析 5 大核心分類函數。
| 函數 | 用途 | 判斷範圍 (含 Unicode) | 範例字元 |
|---|---|---|---|
IsLetter(c) | 是否為字母 | 所有 Unicode 字母類別 (Lu, Ll, Lt, Lm, Lo) | A, a, α, あ, 한 |
IsUpper(c) | 是否為大寫字母 | Unicode 大寫字母 (Lu) | A, Α, А |
IsLower(c) | 是否為小寫字母 | Unicode 小寫字母 (Ll) | a, α, а |
IsDigit(c) | 是否為十進位數字 | Unicode 十進位數字 (Nd) - 0-9 及各語系數字 | 0-9, ٠-٩, ०-९ |
IsNumber(c) | 是否為數字符號 | 含 IsDigit + 分數、羅馬數字、上標下標等 (Nl, No) | ½, Ⅳ, ¹, ², ³ |
uses Character;
procedure TForm1.Button1Click(Sender: TObject); // IsLetter
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)]);
// 字串指定索引檢查 (1-based)
b1 := IsLetter('D2009', 1); // 'D' -> True
b2 := IsLetter('D2009', 2); // '2' -> False
ShowMessageFmt('%s, %s', [BoolToStr(b1,True), BoolToStr(b2,True)]);
end;
procedure TForm1.Button2Click(Sender: TObject); // IsUpper
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)]);
b1 := IsUpper('Delphi', 1); // 'D' -> True
b2 := IsUpper('Delphi', 2); // 'e' -> False
ShowMessageFmt('%s, %s', [BoolToStr(b1,True), BoolToStr(b2,True)]);
end;
procedure TForm1.Button3Click(Sender: TObject); // IsLower
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)]);
b1 := IsLower('Delphi', 1); // False
b2 := IsLower('Delphi', 2); // True
ShowMessageFmt('%s, %s', [BoolToStr(b1,True), BoolToStr(b2,True)]);
end;
procedure TForm1.Button4Click(Sender: TObject); // IsDigit
var b1, b2, b3: Boolean;
begin
b1 := IsDigit('A'); // False
b2 := IsDigit('½'); // False (屬於 IsNumber)
b3 := IsDigit('9'); // True
ShowMessageFmt('%s, %s, %s', [BoolToStr(b1,True), BoolToStr(b2,True), BoolToStr(b3,True)]);
b1 := IsDigit('D2009', 1); // False
b2 := IsDigit('D2009', 2); // True
ShowMessageFmt('%s, %s', [BoolToStr(b1,True), BoolToStr(b2,True)]);
end;
procedure TForm1.Button5Click(Sender: TObject); // IsNumber
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)]);
// 連續檢查包含各類數字符號的字串
b1 := IsNumber('123¹²³¼½¾', 1); // '1' -> True
b2 := IsNumber('123¹²³¼½¾', 4); // '¹' -> True
ShowMessageFmt('%s, %s', [BoolToStr(b1,True), BoolToStr(b2,True)]);
end;
所有函數提供兩種重載:
function IsXxx(C: Char): Boolean; - 檢查單一字元function IsXxx(const S: string; Index: Integer): Boolean; - 檢查字串指定 1-based 位置的字元| 字元 | IsDigit | IsNumber | 說明 |
|---|---|---|---|
| 0-9 | ✓ | ✓ | 基本十進位數字 |
| 阿拉伯數字 ٠-٩ | ✓ | ✓ | Unicode Nd 類別 |
| 分數 ½ ¼ ¾ | ✗ | ✓ | Unicode No 類別 (其他數字) |
| 羅馬數字 Ⅳ Ⅷ | ✗ | ✓ | Unicode Nl 類別 (字母數字) |
| 上標 ¹ ² ³ | ✗ | ✓ | Unicode No 類別 |
| 中文數字 一 二 三 | ✗ | ✓ | Unicode Nl/No 類別 |
function IsAlphaNum(const s: string): Boolean;
var c: Char;
begin
for c in s do
if not (Character.IsLetterOrDigit(c)) then Exit(False);
Result := True;
end;
function CheckPasswordStrength(const pwd: string): Integer;
var
hasUpper, hasLower, hasDigit, hasSymbol: Boolean;
c: Char;
begin
for c in pwd do
begin
if Character.IsUpper(c) then hasUpper := True
else if Character.IsLower(c) then hasLower := True
else if Character.IsDigit(c) then hasDigit := True
else hasSymbol := True;
end;
Result := Ord(hasUpper) + Ord(hasLower) + Ord(hasDigit) + Ord(hasSymbol);
end;
function ExtractNumbers(const s: string): string;
var c: Char;
begin
Result := '';
for c in s do
if Character.IsNumber(c) then Result := Result + c;
end;
// ExtractNumbers('價格: 123元 ½ 折') -> '123½'
| 舊版 | 新版 Character 單元 | 優勢 |
|---|---|---|
c in ['A'..'Z', 'a'..'z'] | IsLetter(c) | 支援 Unicode 全語系字母 |
c in ['0'..'9'] | IsDigit(c) | 支援各語系數字 |
UpCase(c) | ToUpper(c) | 正確處理 Unicode 大小寫對應 |
LowerCase(s) | ToLower(s) | 字串級 Unicode 轉換 |
Character 單元的 IsLetter/IsUpper/IsLower/IsDigit/IsNumber 以 Unicode 標準為基礎,徹底解決舊版 ANSI 字元判斷的侷限性。掌握 IsDigit (僅十進位) vs IsNumber (所有數字符號) 的差異,能精準處理國際化輸入驗證、解析與格式化需求。