2008-09-18 69 views

回答

4

Seanyboy的IsCharAlphaAanswer接近。最好的方法是使用W版本,像這樣:

Private Declare Function IsCharAlphaW Lib "user32" (ByVal cChar As Integer) As Long 
Public Property Get IsLetter(character As String) As Boolean 
    IsLetter = IsCharAlphaW(AscW(character)) 
End Property 

當然,這一切基本上沒有什麼關係,因爲所有VB6的控件是ANSI只有

7

這是rpetrich發佈的代碼的一部分,以響應questionJoel Spolsky發佈。我覺得它需要一個特定於它解決的問題的帖子。它真的很棒。

Private Function IsLetter(ByVal character As String) As Boolean 
    IsLetter = UCase$(character) <> LCase$(character) 
End Function 

你可能在想,「這會一直工作嗎?」在用Ucase和LCASE函數的文檔,證實將:

UCASE函數只有小寫字母被轉換爲大寫; 所有大寫字母和非字母字符保持不變

LCase功能只有大寫字母被轉換爲小寫字母; 所有小寫字母和非字母字符保持不變

+0

完成使用。好主意,因爲這種方法適用於a..z和A..Z之外的字母。 – raven 2008-09-18 20:22:11

+2

這是超優雅的,但只適用於使用拉丁字母的大小寫變體的語言。 – 2008-09-18 20:23:41

1

以下哪種錯誤不依賴於模糊的語言行爲?

Private Function IsLetter(ByVal ch As String) As Boolean 
    IsLetter = (ch >= "A" and ch <= "Z") or (ch >= "a" and ch <= "z") 
End Function 
+1

它只適用於英文字母;它不適用於帶重音符號的字母。 – 2008-09-18 14:43:54

+0

快照。我們寫了幾乎相同的代碼。 雖然 - 關於ANSI字符集的好點。 – seanyboy 2008-09-18 14:46:10

-1

它並不完全記錄自身。它可能會很慢。這是一個聰明的黑客,但就是這樣。在我的檢查中我會更加明顯。要麼使用正則表達式,要麼寫一個更明顯的測試。

public bool IsAlpha(String strToCheck) 
{ 
    Regex objAlphaPattern=new Regex("[^a-zA-Z]"); 
    return !objAlphaPattern.IsMatch(strToCheck); 
} 

public bool IsCharAlpha(char chToCheck) 
{ 
    return ((chToCheck=>'a') and (chToCheck<='z')) or ((chToCheck=>'A') and (chToCheck<='Z')) 
} 
+1

是不是C#?標題爲VB6的問題有點偏離主題? – MarkJ 2009-05-11 09:42:55

0

環顧了一下想出了下面......

Private Declare Function IsCharAlphaA Lib "user32" Alias "IsCharAlphaA" (ByVal cChar As Byte) As Long 

我相信IsCharAlphaA測試ANSI字符集和IsCharAlpha測試ASCII。我可能是錯的。

+1

與大多數Windows函數一樣... IsCharAlphaA是ANSI版本 IsCharAlphaW是Unicode版本 IsCharAlpha是一個宏,它的行爲取決於是否定義了UNICODE – 2008-09-18 20:24:46

0
Private Function IsAlpha(ByVal vChar As String) As Boolean 
    Const letters$ = "abcdefghijklmnopqrstuvwxyz" 

    If InStr(1, letters, LCase$(vChar)) > 0 Then IsAlpha = True 
End Function 
2
Private Function IsLetter(Char As String) As Boolean 
    IsLetter = UCase(Char) Like "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]" 
End Function 
1

我相信我們能在這多一點的改善。 rpetrich的代碼可以工作,但也許只能靠運氣。 API調用的參數應該是TCHAR(實際上是WCHAR),而不是Long。這也意味着沒有與轉換爲Long或掩蓋與012FFHFFFF擺弄。順便提一句,這是Integer,並且在這裏也向Long添加了一個隱式轉換。也許他的意思是& HFFFF &在這種情況下?

最重要的是,爲了Win9X的兼容性,最好明確地調用UnicoWS包裝來調用此API。 UnicoWS.dll可能需要部署,但至少我們可以獲得該選項。然後,也許從VB6這是自動重定向,我沒有安裝Win9X來測試它。

Option Explicit 

Private Declare Function IsCharAlphaW Lib "unicows" (ByVal WChar As Integer) As Long 

Private Function IsLetter(Character As String) As Boolean 
    IsLetter = IsCharAlphaW(AscW(Character)) 
End Function 

Private Sub Main() 
    MsgBox IsLetter("^") 
    MsgBox IsLetter("A") 
    MsgBox IsLetter(ChrW$(&H34F)) 
    MsgBox IsLetter(ChrW$(&HFEF0)) 
    MsgBox IsLetter(ChrW$(&HFEFC)) 
End Sub 
0

我在VBA

Function IsLettersOnly(Value As String) As Boolean 
    IsLettersOnly = Len(Value) > 0 And Not UCase(Value) Like "*[!A-Z]*" 
End Function 
相關問題