确定VB6中字符是否为字母的最佳方法是什么?

时间:2020-03-06 14:21:38  来源:igfitidea点击:

需要一个将字符作为参数并如果为字母则返回true的函数。

解决方案

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

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

我们可能在想自己,"这将始终有效吗?"有关UCase和LCase功能的文档,确认将:

UCase Function Only lowercase letters are converted to uppercase;
  all uppercase letters and nonletter characters remain unchanged.
  
  LCase Function Only uppercase letters are converted to lowercase;
  all lowercase letters and nonletter characters remain unchanged.

以下内容出了什么问题,这些内容不依赖于晦涩的语言行为?

Private Function IsLetter(ByVal ch As String) As Boolean
    IsLetter = (ch >= "A" and ch <= "Z") or (ch >= "a" and ch <= "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'))
}

环顾四周,提出了以下建议...

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

Private Function IsLetter(Char As String) As Boolean
    IsLetter = UCase(Char) Like "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]"
End Function

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的

我相信我们可以在此基础上再做些改进。 rpetrich的代码将起作用,但可能仅靠运气。 API调用的参数应该是TCHAR(实际上是WCHAR),而不是Long。这也意味着无需摆弄Long或者使用&HFFFF进行掩码。顺便说一下,这是Integer,在这里也向Long添加了一个隐式转换。在这种情况下,也许他的意思是&HFFFF&?

最重要的是,对于Win9X兼容性,最好为此API显式调用UnicoWS包装器。 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