Was ist der beste Weg, um zu bestimmen, ob ein Zeichen ein Buchstabe in VB6 ist?

StackOverflow https://stackoverflow.com/questions/93105

  •  01-07-2019
  •  | 
  •  

Frage

Sie benötigen eine Funktion, die ein Zeichen als Parameter und gibt true zurück, wenn es ein Buchstabe ist.

War es hilfreich?

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'))
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top