Нужна функция, которая принимает символ в качестве параметра и возвращает true, если это буква.Каков наилучший способ определить, является ли символ буквой в VB6?
ответ
Seanyboy-х IsCharAlphaA
answer близко. Лучший способ заключается в использовании версии 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 в ответ на question от Joel Spolsky. Я чувствовал, что ему нужна должность, специфичная для проблемы, которую она решает. Это действительно блестяще.
Private Function IsLetter(ByVal character As String) As Boolean
IsLetter = UCase$(character) <> LCase$(character)
End Function
Возможно, вы думаете о себе: «Это всегда будет работать?» Документация по функциям UCase и LCASE, подтверждает, что он будет:
Функция UCase только строчные буквы преобразуются в верхний регистр; все заглавные буквы и символы без символа остаются неизменными.
LCase Function Только прописные буквы преобразуются в строчные буквы; все буквы нижнего регистра и символы без символа остаются неизменными.
Что случилось со следующим, что не зависит от неясного языкового поведения?
Private Function IsLetter(ByVal ch As String) As Boolean
IsLetter = (ch >= "A" and ch <= "Z") or (ch >= "a" and ch <= "z")
End Function
Он работает только для писем на английском языке; он не работает для писем с акцентами. – 2008-09-18 14:43:54
Snap. Мы писали почти тот же код. Хотя - хорошая точка в наборах символов ANSI. – seanyboy 2008-09-18 14:46:10
Это не совсем документ. И это может быть медленным. Это умный хак, но это все. У меня возникло бы желание быть более очевидным в моей проверке. Либо используйте регулярное выражение, либо напишите более очевидный тест.
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'))
}
Разве это не C#? Немного не по теме в вопросительном теге VB6? – MarkJ 2009-05-11 09:42:55
Глядя вокруг немного придумал следующее ...
Private Declare Function IsCharAlphaA Lib "user32" Alias "IsCharAlphaA" (ByVal cChar As Byte) As Long
Я считаю IsCharAlphaA тесты наборов символов ANSI и IsCharAlpha тесты ASCII. Возможно, я ошибаюсь.
Как и большинство функций Windows, ... IsCharAlphaA является ANSI версия IsCharAlphaW является версия Unicode IsCharAlpha является макро поведение whoses зависит от того, UNICODE определен – 2008-09-18 20:24:46
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
Я считаю, что мы можем улучшить это немного больше. Код rpetrich будет работать, но, возможно, только удачи. Параметр вызова API должен быть TCHAR (на самом деле WCHAR), а не Long. Это также означает отсутствие попыток конвертации в Long или маскирование с помощью 0FF. Это, кстати, Integer и добавляет неявное преобразование в Long здесь тоже. Возможно, он имел в виду & HFFFF & в этом случае?
Кроме того, было бы лучше всего называть оболочку UnicoWS для этого вызова API для совместимости с 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
Я использую это в VBA
Function IsLettersOnly(Value As String) As Boolean
IsLettersOnly = Len(Value) > 0 And Not UCase(Value) Like "*[!A-Z]*"
End Function
Done. Хорошая идея, так как этот метод работает с буквами вне a..z и A..Z. – raven 2008-09-18 20:22:11
Это супер-элегантный, но работает только для языков с использованием латинских алфавитов, имеющих варианты верхнего и нижнего регистра. – 2008-09-18 20:23:41