确定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