Besoin d'une fonction qui prend un caractère en paramètre et renvoie vrai s'il s'agit d'une lettre.Quelle est la meilleure façon de déterminer si un caractère est une lettre dans VB6?
Répondre
Seanyboy de IsCharAlphaA
answer 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
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.
Terminé. Bonne idée, puisque cette méthode fonctionne avec des lettres en dehors de a..z et A..Z. – raven
Ceci est super-élégant, mais ne fonctionne que pour les langues utilisant des alphabets latins qui ont des variantes majuscules et minuscules. –
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
Cela ne fonctionne que pour les lettres en anglais; cela ne fonctionne pas pour les lettres avec des accents. –
Snap. Nous avons écrit presque le même code. Bien - bon point sur les jeux de caractères ANSI. – seanyboy
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'))
}
N'est-ce pas C#? Un peu hors-sujet dans une question marquée VB6? – MarkJ
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.
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 –
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
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
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
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
J'utiliser dans VBA
Function IsLettersOnly(Value As String) As Boolean
IsLettersOnly = Len(Value) > 0 And Not UCase(Value) Like "*[!A-Z]*"
End Function
- 1. Comment déterminer si un caractère est une lettre en Java?
- 2. Quelle est la meilleure façon de déterminer si un System.DateTime est minuit?
- 3. Quelle est la meilleure façon de déterminer si une table temporaire existe dans SQL Server?
- 4. Quelle est la meilleure façon de déterminer si un horodatage correspond aux heures d'ouverture saisonnières?
- 5. Quelle est la meilleure façon de supprimer les espaces après un certain caractère dans une chaîne?
- 6. Quelle est la meilleure façon de détecter si un objet Javascript donné est un élément DOM?
- 7. Quelle est la façon la plus pythonique de déterminer l'endianisme?
- 8. Quelle est la meilleure façon de déterminer le nom de votre machine dans une application .NET?
- 9. Quelle est la meilleure façon de détecter si un IDataReader est vide?
- 10. Quelle est la meilleure façon de hacher cette structure complexe dans VB6?
- 11. Dans ActionScript, quelle est la meilleure façon de vérifier si une propriété de noeud xml existe?
- 12. Quelle est la meilleure façon d'écrire dans un fichier Ruby?
- 13. Quelle est la meilleure façon de déboguer un écrasement explorer.exe?
- 14. Quelle est la meilleure façon de structurer un projet?
- 15. quelle est la meilleure façon de marquer un texte?
- 16. Quelle est la meilleure façon de déboguer un Oracle SP?
- 17. Quelle est la meilleure façon de localiser un IEnumerable?
- 18. Quelle est la meilleure façon de chiffrer un clob?
- 19. La meilleure façon de déterminer rapidement si un compte d'utilisateur est membre d'un groupe AD?
- 20. Quelle est la meilleure façon de rafraîchir un indice Nutch?
- 21. Quelle est la meilleure façon d'effacer un tableau de chaînes?
- 22. Quelle est la meilleure façon de vider un répertoire?
- 23. Quelle est la meilleure façon de dupliquer fork() dans Windows?
- 24. Quelle est la meilleure façon de détecter si Excel 2003 est installé?
- 25. Quelle est la meilleure façon d'implémenter un délai AJAX?
- 26. Quelle est la meilleure façon de formater C# dans WordPress?
- 27. Quelle est la meilleure façon d'appliquer une ombre portée?
- 28. Quelle est la meilleure façon de vérifier si l'option actuellement sélectionnée dans une liste déroulante est la dernière?
- 29. Quelle est la bonne façon de tester si un objet est un objet jQuery en javascript?
- 30. Quelle est la meilleure façon d'initialiser une application?
+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
Oui, votre implémentation IsLetter était soignée, mais pas complète. Ceci est vraiment mieux. – raven