2008-09-18 6 views

ответ

4

Seanyboy-х IsCharAlphaAanswer близко. Лучший способ заключается в использовании версии 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 только

7

Это была часть кода 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 Только прописные буквы преобразуются в строчные буквы; все буквы нижнего регистра и символы без символа остаются неизменными.

+0

Done. Хорошая идея, так как этот метод работает с буквами вне a..z и A..Z. – raven 2008-09-18 20:22:11

+2

Это супер-элегантный, но работает только для языков с использованием латинских алфавитов, имеющих варианты верхнего и нижнего регистра. – 2008-09-18 20:23:41

1

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

Private Function IsLetter(ByVal ch As String) As Boolean 
    IsLetter = (ch >= "A" and ch <= "Z") or (ch >= "a" and ch <= "z") 
End Function 
+1

Он работает только для писем на английском языке; он не работает для писем с акцентами. – 2008-09-18 14:43:54

+0

Snap. Мы писали почти тот же код. Хотя - хорошая точка в наборах символов ANSI. – seanyboy 2008-09-18 14:46:10

-1

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

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')) 
} 
+1

Разве это не C#? Немного не по теме в вопросительном теге VB6? – MarkJ 2009-05-11 09:42:55

0

Глядя вокруг немного придумал следующее ...

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

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

+1

Как и большинство функций Windows, ... IsCharAlphaA является ANSI версия IsCharAlphaW является версия Unicode IsCharAlpha является макро поведение whoses зависит от того, UNICODE определен – 2008-09-18 20:24:46

0
Private Function IsAlpha(ByVal vChar As String) As Boolean 
    Const letters$ = "abcdefghijklmnopqrstuvwxyz" 

    If InStr(1, letters, LCase$(vChar)) > 0 Then IsAlpha = True 
End Function 
2
Private Function IsLetter(Char As String) As Boolean 
    IsLetter = UCase(Char) Like "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]" 
End Function 
1

Я считаю, что мы можем улучшить это немного больше. Код 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 
0

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

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