需要一个以字符为参数的函数,如果是字母则返回 true。
9 回答
这是rpetrich为回答Joel Spolsky的问题而发布的代码的一部分。我觉得它需要一个专门针对它解决的问题的帖子。它真的很棒。
Private Function IsLetter(ByVal character As String) As Boolean
IsLetter = UCase$(character) <> LCase$(character)
End Function
你可能会想,“这总是有效吗?” UCase 和 LCase 函数的文档确认它将:
UCase 函数只将小写字母转换为大写; 所有大写字母和非字母字符保持不变。
LCase 函数只将大写字母转换为小写; 所有小写字母和非字母字符保持不变。
Seanyboy 的IsCharAlphaA
回答很接近。最好的方法是像这样使用 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
Private Function IsLetter(Char As String) As Boolean
IsLetter = UCase(Char) Like "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]"
End Function
以下不依赖于晦涩的语言行为有什么问题?
Private Function IsLetter(ByVal ch As String) As Boolean
IsLetter = (ch >= "A" and ch <= "Z") or (ch >= "a" and ch <= "z")
End Function
我相信我们可以在这方面再改进一点。 rpetrich的代码可以工作,但也许只能靠运气。API 调用的参数应该是 TCHAR(实际上是 WCHAR)而不是 Long。这也意味着无需摆弄转换为 Long 或使用 &HFFFF 进行屏蔽。顺便说一下,这是 Integer 并且在这里也添加了对 Long 的隐式转换。在这种情况下,也许他的意思是 &HFFFF& ?
最重要的是,最好为此 API 调用显式调用 UnicoWS 包装器,以实现 Win9X 兼容性。可能需要部署 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
环顾四周,想到了以下...
Private Declare Function IsCharAlphaA Lib "user32" Alias "IsCharAlphaA" (ByVal cChar As Byte) As Long
我相信 IsCharAlphaA 测试 ANSI 字符集,而 IsCharAlpha 测试 ASCII。我可能错了。
Private Function IsAlpha(ByVal vChar As String) As Boolean
Const letters$ = "abcdefghijklmnopqrstuvwxyz"
If InStr(1, letters, LCase$(vChar)) > 0 Then IsAlpha = True
End Function
我在 VBA 中使用它
Function IsLettersOnly(Value As String) As Boolean
IsLettersOnly = Len(Value) > 0 And Not UCase(Value) Like "*[!A-Z]*"
End Function
它并没有完全记录自己。而且可能很慢。这是一个聪明的技巧,但仅此而已。我很想在我的检查中表现得更加明显。要么使用正则表达式,要么编写更明显的测试。
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'))
}