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

有帮助吗?

解决方案

西尼男孩的 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(ByVal character As String) As Boolean
    IsLetter = UCase$(character) <> LCase$(character)
End Function

您可能在想自己,“这总是有效吗?” UCASE和LCASE功能上的文档确认它将:

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

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

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

我相信我们可以在这方面进一步改进。 佩特里奇的代码可以工作,但也许只能靠运气。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'))
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top