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

什么';在VB6中,确定字符是否为字母的最佳方法是什么?,vb6,Vb6,需要一个函数,该函数将字符作为参数,如果是字母,则返回true。这是为响应by而发布的代码的一部分。我觉得它需要一个专门针对它解决的问题的帖子。真是太棒了 Private Function IsLetter(ByVal character As String) As Boolean IsLetter = UCase$(character) <> LCase$(character) End Function Private函数isleter(ByVal字符作为字符串)作为布尔

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

这是为响应by而发布的代码的一部分。我觉得它需要一个专门针对它解决的问题的帖子。真是太棒了

Private Function IsLetter(ByVal character As String) As Boolean
    IsLetter = UCase$(character) <> LCase$(character)
End Function
Private函数isleter(ByVal字符作为字符串)作为布尔值
IsLetter=UCase$(字符)LCase$(字符)
端函数
您可能会想,“这会一直有效吗?”关于UCase和LCase功能的文档确认了它将:

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

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


下面这些不依赖于晦涩的语言行为的问题是什么

Private Function IsLetter(ByVal ch As String) As Boolean
    IsLetter = (ch >= "A" and ch <= "Z") or (ch >= "a" and ch <= "z")
End Function
Private函数isleter(ByVal ch As String)作为布尔值

IsLetter=(ch>=“A”和ch=“A”和ch它并没有准确地记录自身。而且它可能很慢。这是一个聪明的黑客,但仅此而已。我很想在我的检查中表现得更明显。要么使用正则表达式,要么编写一个更明显的测试

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'))
}
public bool IsAlpha(字符串strToCheck)
{
正则表达式objAlphaPattern=新正则表达式(“[^a-zA-Z]”);
return!objAlphaPattern.IsMatch(strToCheck);
}
公共学校伊斯查拉尔法(char chToCheck)
{

return((chToCheck=>'a')和(chToCheck'a')和(chToCheck环顾四周,得出以下结论

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

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

Seanyboy的
IsCharAlpha
很接近。最好的方法是像这样使用W版本:

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 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)不是长的。这也意味着不能随意转换为长的或用&HFFFF屏蔽。顺便说一下,这是整数,在这里也添加了一个对长的隐式转换。在这种情况下,他可能是指&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
我在VBA中使用它

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

它只适用于英语字母;不适用于带重音的字母。Snap。我们编写了几乎相同的代码。虽然-ANSI字符集的优点很好。完成。好主意,因为这种方法适用于a..z和a..z之外的字母。这非常优雅,但只适用于使用拉丁字母表的语言,这些字母表有上下两个字母大小写变体。与大多数Windows函数一样…IsCharAlpha是ANSI版本IsCharAlphaW是Unicode版本IsCharAlpha是宏,其行为取决于是否定义Unicode API声明在双字节代码页上不起作用-例如,中文、日文。“ANSI”这些代码页上的字符可以超过一个字节。这不是C#?在一个标记为VB6?+1的问题中有点离题了吗?给自己更多的信任!你是对的,Seanyboy是错的。Seanyboy的API声明在双字节代码页上不起作用-例如,中文、日语。“ANSI”这些代码页上的字符可以超过一个字节。是的,您的Islater实现很简洁,但不完整。这要好得多。您是对的,因为Integer是正确的声明。我将编辑我的答案以反映这一点。不过,我仍然认为user32应该是默认选择;大多数情况下,不需要95/98/ME支持,而且只是需要做更多的工作来正确部署unicows。
Function IsLettersOnly(Value As String) As Boolean
   IsLettersOnly = Len(Value) > 0 And Not UCase(Value) Like "*[!A-Z]*"
End Function