2008-09-18 7 views

Répondre

4

Seanyboy de IsCharAlphaAanswer est proche. La meilleure méthode consiste à utiliser la version W comme ceci:

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 

Bien sûr, tout cela importe peu que tous les contrôles de VB6 sont ANSI seulement

+0

+1, et donnez-vous plus de crédit! Vous avez raison et Seanyboy a tort. La déclaration API de Seanyboy ne fonctionnera pas sur les pages de codes à deux octets - par ex. Chinois, Japonais. Les caractères "ANSI" peuvent avoir plus d'un octet sur ces pages de code. – MarkJ

+0

Oui, votre implémentation IsLetter était soignée, mais pas complète. Ceci est vraiment mieux. – raven

7

Cela faisait partie du code affiché par rpetrich en réponse à un question par Joel Spolsky. J'ai senti qu'il avait besoin d'un post spécifique au problème qu'il résout. C'est vraiment génial.

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

Vous pensez peut-être: «Cela fonctionnera-t-il toujours? La documentation sur les fonctions UCase et LCase, confirme qu'il:

UCase Fonction Seules les lettres minuscules sont converties en majuscules; toutes les lettres majuscules et les caractères non-lettre restent inchangés.

Fonction LCase Seules les majuscules sont converties en minuscules; toutes les lettres minuscules et les caractères non-lettre restent inchangés.

+0

Terminé. Bonne idée, puisque cette méthode fonctionne avec des lettres en dehors de a..z et A..Z. – raven

+2

Ceci est super-élégant, mais ne fonctionne que pour les langues utilisant des alphabets latins qui ont des variantes majuscules et minuscules. –

1

Qu'est-ce qui ne va pas avec ce qui suit, qui ne repose pas sur un comportement de langage obscur?

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

Cela ne fonctionne que pour les lettres en anglais; cela ne fonctionne pas pour les lettres avec des accents. –

+0

Snap. Nous avons écrit presque le même code. Bien - bon point sur les jeux de caractères ANSI. – seanyboy

-1

Il ne se documente pas exactement lui-même. Et ça peut être lent. C'est un bidouillage intelligent, mais c'est tout. Je serais tenté d'être plus évident dans mes vérifications. Utilisez soit regex ou écrire un test plus évident.

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

N'est-ce pas C#? Un peu hors-sujet dans une question marquée VB6? – MarkJ

0

En regardant autour un peu venu avec ce qui suit ...

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

Je crois que les tests IsCharAlphaA jeux de caractères ANSI et teste IsCharAlpha ASCII. J'ai peut-être tort.

+1

Comme la plupart des fonctions de Windows ... IsCharAlphaA est la version ANSI IsCharAlphaW est la version Unicode IsCharAlpha est un comportement whoses macro dépend de UNICODE est défini –

+0

Cette déclaration API ne fonctionnera pas sur les pages de code à deux octets - par exemple Chinois, Japonais. Les caractères "ANSI" peuvent avoir plus d'un octet sur ces pages de code. – MarkJ

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

Je crois que nous pouvons améliorer cela un peu plus. Le code de rpetrich fonctionnera, mais peut-être seulement par chance. Le paramètre de l'appel de l'API doit être un TCHAR (WCHAR ici en fait) et non un Long. Cela signifie également ne pas jouer avec la conversion à un long ou masquant avec & HFFFF. Ceci est d'ailleurs Integer et ajoute une conversion implicite à Long ici aussi. Peut-être qu'il voulait dire & HFFFF & dans ce cas? En plus de cela, il peut être préférable d'appeler explicitement l'encapsuleur UnicoWS pour cet appel API, pour la compatibilité Win9X. Le UnicoWS.dll peut devoir être déployé mais au moins nous gagnons cette option. Puis peut-être à partir de VB6 cela est automatiquement redirigé, Win9X n'est pas installé pour le tester.

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

Vous avez raison - Comme Integer est la déclaration correcte. Je vais modifier ma réponse pour refléter cela. Je crois toujours que user32 devrait être le choix par défaut cependant; La plupart du temps, la prise en charge de 95/98/ME n'est pas requise et il ne reste plus qu'à déployer les Unicows correctement. – rpetrich

0

J'utiliser dans VBA

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