Was ist der beste Weg, um zu bestimmen, ob ein Zeichen ein Buchstabe in VB6 ist?
-
01-07-2019 - |
Frage
Sie benötigen eine Funktion, die ein Zeichen als Parameter und gibt true zurück, wenn es ein Buchstabe ist.
Lösung
Seanyboy des IsCharAlphaA
Antwort ist in der Nähe. Die beste Methode ist die W-Version wie so zu verwenden:
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
Natürlich ist dies alles nur selten von Bedeutung, da alle VB6 die Kontrollen sind nur ANSI
Andere Tipps
Dies war Teil des Codes veröffentlicht von rpetrich in Reaktion auf eine Frage von Joel Spolsky . Ich fühlte, es brauchte ein Post spezifisch für das Problem löst es. Es ist wirklich brillant.
Private Function IsLetter(ByVal character As String) As Boolean
IsLetter = UCase$(character) <> LCase$(character)
End Function
Sie können sich denken, „Wird das immer?“ Die Dokumentation zu der UCase und LCase Funktionen, bestätigt, dass es wird:
UCase Funktion Es werden nur Kleinbuchstaben in Großbuchstaben umgewandelt werden; alle Großbuchstaben und nonletter Zeichen bleiben unverändert .
LCase Funktion Es werden nur Großbuchstaben in Kleinbuchstaben umgewandelt werden; alle Kleinbuchstaben und nonletter Zeichen bleiben unverändert .
Private Function IsLetter(Char As String) As Boolean
IsLetter = UCase(Char) Like "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]"
End Function
Was ist mit folgendem falsch ist, die auf obskure Sprache Verhalten beruhen nicht?
Private Function IsLetter(ByVal ch As String) As Boolean
IsLetter = (ch >= "A" and ch <= "Z") or (ch >= "a" and ch <= "z")
End Function
Ich glaube, dass wir auf dieser ein wenig mehr verbessern kann. rpetrich 's-Code wird funktionieren, aber vielleicht nur durch Glück. Die Parameter der API-Aufruf sollte (hier eigentlich WCHAR) ein TCHAR sein und kein Long. Das bedeutet auch, keine Fummelei auf einen lange mit der Umwandlung oder Maskierung mit & HFFFF. Dies wird durch die Art und Weise ist Integer und fügt eine implizite Konvertierung zu lange hier auch. Vielleicht meinte er & HFFFF & in diesem Fall?
Hinzu kommt, dass es am besten sein könnte explictly für diesen API-Aufruf die Unicows Wrapper nennen, für Win9X Kompatibilität. Die unicows.dll können müssen eingesetzt werden, aber zumindest gewinnen wir diese Option. Dann wieder vielleicht von VB6 wird diese automatisch umgeleitet, ich habe nicht Win9X es zu testen installiert.
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
um ein bisschen Suchen Sie kam mit dem folgenden ...
Private Declare Function IsCharAlphaA Lib "user32" Alias "IsCharAlphaA" (ByVal cChar As Byte) As Long
Ich glaube, IsCharAlphaA testet ANSI-Zeichensätze und IsCharAlpha testet ASCII. Ich kann mich irren.
Private Function IsAlpha(ByVal vChar As String) As Boolean
Const letters$ = "abcdefghijklmnopqrstuvwxyz"
If InStr(1, letters, LCase$(vChar)) > 0 Then IsAlpha = True
End Function
Ich benutze dies in VBA
Function IsLettersOnly(Value As String) As Boolean
IsLettersOnly = Len(Value) > 0 And Not UCase(Value) Like "*[!A-Z]*"
End Function
Es ist nicht genau selbst dokumentieren. Und es kann langsam sein. Es ist ein kluger Hack, aber das ist alles, es ist. Ich würde versucht sein, in meiner Kontrolle deutlicher zu sein. Entweder verwendet regex ist, oder schreiben offensichtlichen Test.
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'))
}