Как лучше всего определить, является ли символ буквой в VB6? - PullRequest
5 голосов
/ 18 сентября 2008

Нужна функция, которая принимает символ в качестве параметра и возвращает true, если это буква.

Ответы [ 9 ]

10 голосов
/ 18 сентября 2008

Это было частью кода, опубликованного rpetrich в ответ на вопрос от Джоэл Спольски . Я чувствовал, что ему нужен пост, посвященный проблеме, которую он решает. Это действительно великолепно.

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

Вы можете подумать про себя: "Будет ли это всегда работать?" Документация по функциям UCase и LCase подтверждает, что она будет:

Функция UCase Только строчные буквы преобразуются в прописные; все заглавные буквы и символы, не являющиеся буквами, остаются без изменений .

Функция LCase Только заглавные буквы преобразуются в строчные; все строчные буквы и символы, не являющиеся буквами, остаются без изменений .

4 голосов
/ 21 сентября 2008

Seanyboy's 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

2 голосов
/ 20 сентября 2008
Private Function IsLetter(Char As String) As Boolean
    IsLetter = UCase(Char) Like "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]"
End Function
1 голос
/ 21 июня 2009

Я считаю, что мы можем улучшить это немного больше. Код rpetrich будет работать, но, возможно, только благодаря удаче. Параметр вызова API должен быть TCHAR (здесь на самом деле WCHAR), а не Long. Это также означает, что вам не нужно переходить к длинному или маскировать с помощью & HFFFF. Это, кстати, Integer и добавляет здесь неявное преобразование в Long. Возможно, он имел в виду & HFFFF & в этом случае?

Кроме того, для совместимости с Win9X лучше всего явно вызвать оболочку UnicoWS для этого вызова API. 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
1 голос
/ 18 сентября 2008

Что не так со следующим, который не зависит от неясного поведения языка?

Private Function IsLetter(ByVal ch As String) As Boolean
    IsLetter = (ch >= "A" and ch <= "Z") or (ch >= "a" and ch <= "z")
End Function
0 голосов
/ 12 марта 2014

Я использую это в VBA

Function IsLettersOnly(Value As String) As Boolean
   IsLettersOnly = Len(Value) > 0 And Not UCase(Value) Like "*[!A-Z]*"
End Function
0 голосов
/ 18 сентября 2008
Private Function IsAlpha(ByVal vChar As String) As Boolean
  Const letters$ = "abcdefghijklmnopqrstuvwxyz"

  If InStr(1, letters, LCase$(vChar)) > 0 Then IsAlpha = True
End Function
0 голосов
/ 18 сентября 2008

Осмотревшись немного, придумал следующее ...

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

Я считаю, что IsCharAlphaA тестирует наборы символов ANSI, а IsCharAlpha тестирует ASCII. Я могу ошибаться

0 голосов
/ 18 сентября 2008

Точно не документирует себя. И это может быть медленным. Это умный взлом, но это все, что есть. Я был бы соблазн быть более очевидным в моей проверке. Или используйте регулярные выражения или напишите более очевидный тест.

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'))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...