首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 2009 Character 單元進階:字元分類函數 IsLetter/IsDigit/IsNumber 完整解析

     編輯:Delphi

Character 單元:Unicode 時代的字元工具箱

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 vs IsNumber 關鍵差異

字元IsDigitIsNumber說明
0-9✓✓基本十進位數字
阿拉伯數字 ٠-٩✓✓Unicode Nd 類別
分數 ½ ¼ ¾✗✓Unicode No 類別 (其他數字)
羅馬數字 Ⅳ Ⅷ✗✓Unicode Nl 類別 (字母數字)
上標 ¹ ² ³✗✓Unicode No 類別
中文數字 一 二 三✗✓Unicode Nl/No 類別

實務應用場景

1. 輸入驗證:僅允許字母數字


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;

2. 密碼強度檢查:需含大小寫、數字、特殊符號


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;

3. 解析含特殊數字符號的字串


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 (所有數字符號) 的差異,能精準處理國際化輸入驗證、解析與格式化需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved