5

需要一个以字符为参数的函数,如果是字母则返回 true。

4

9 回答 9

10

这是rpetrich回答Joel Spolsky的问题而发布的代码的一部分。我觉得它需要一个专门针对它解决的问题的帖子。它真的很棒。

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

你可能会想,“这总是有效吗?” UCase 和 LCase 函数的文档确认它将:

UCase 函数只将小写字母转换为大写; 所有大写字母和非字母字符保持不变

LCase 函数只将大写字母转换为小写; 所有小写​​字母和非字母字符保持不变

于 2008-09-18T14:36:02.863 回答
4

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

于 2008-09-20T20:11:44.310 回答
2
Private Function IsLetter(Char As String) As Boolean
    IsLetter = UCase(Char) Like "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]"
End Function
于 2008-09-19T20:44:22.633 回答
1

以下不依赖于晦涩的语言行为有什么问题?

Private Function IsLetter(ByVal ch As String) As Boolean
    IsLetter = (ch >= "A" and ch <= "Z") or (ch >= "a" and ch <= "z")
End Function
于 2008-09-18T14:40:07.907 回答
1

我相信我们可以在这方面再改进一点。 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
于 2009-06-21T19:49:12.050 回答
0

环顾四周,想到了以下...

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

我相信 IsCharAlphaA 测试 ANSI 字符集,而 IsCharAlpha 测试 ASCII。我可能错了。

于 2008-09-18T14:55:13.987 回答
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
于 2008-09-18T19:34:49.773 回答
0

我在 VBA 中使用它

Function IsLettersOnly(Value As String) As Boolean
   IsLettersOnly = Len(Value) > 0 And Not UCase(Value) Like "*[!A-Z]*"
End Function
于 2014-03-12T08:34:27.387 回答
-2

它并没有完全记录自己。而且可能很慢。这是一个聪明的技巧,但仅此而已。我很想在我的检查中表现得更加明显。要么使用正则表达式,要么编写更明显的测试。

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'))
}
于 2008-09-18T14:44:19.427 回答