practicar - ¿Cuál es la mejor manera de determinar si un personaje es una letra en VB6?
visual basic descargar (9)
Necesita una función que tome un carácter como parámetro y devuelva verdadero si es una letra.
¿Qué hay de malo con lo siguiente, que no se basa en un comportamiento de lenguaje oscuro?
Private Function IsLetter(ByVal ch As String) As Boolean
IsLetter = (ch >= "A" and ch <= "Z") or (ch >= "a" and ch <= "z")
End Function
Creo que podemos mejorar esto un poco más. El código de rpetrich funcionará, pero quizás solo por suerte. El parámetro de la llamada API debe ser un TCHAR (WCHAR aquí en realidad) y no un Long. Esto también significa que no hay que alterar la conversión a un Long o enmascarar con & HFFFF. Por cierto, esto es Integer y agrega una conversión implícita a Long aquí también. Quizás quiso decir & HFFFF & en este caso?
Además de eso, sería mejor llamar explícitamente al contenedor UnicoWS para esta llamada API, para compatibilidad con Win9X. Puede ser necesario implementar UnicoWS.dll, pero al menos obtenemos esa opción. Por otra parte, tal vez desde VB6 esto se redirige automágicamente, no tengo instalado Win9X para probarlo.
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
Esto fue parte del código publicado por rpetrich en respuesta a una pregunta de Joel Spolsky . Sentí que necesitaba una publicación específica para el problema que resuelve. Realmente es brillante.
Private Function IsLetter(ByVal character As String) As Boolean
IsLetter = UCase$(character) <> LCase$(character)
End Function
Usted puede estar pensando: "¿Esto siempre funcionará?" La documentación sobre las funciones UCase y LCase, confirma que:
Función UCase Solo las letras minúsculas se convierten a mayúsculas; todas las letras mayúsculas y los caracteres que no son letras permanecen sin cambios .
Función LCase Solo las letras mayúsculas se convierten a minúsculas; todas las letras minúsculas y los caracteres que no son letras permanecen sin cambios .
Mirando un poco se produjo lo siguiente ...
Private Declare Function IsCharAlphaA Lib "user32" Alias "IsCharAlphaA" (ByVal cChar As Byte) As Long
Creo que IsCharAlphaA prueba los conjuntos de caracteres ANSI y IsCharAlpha prueba ASCII. Puedo estar equivocado.
No se documenta exactamente. Y puede ser lento. Es un truco inteligente, pero eso es todo. Estaría tentado de ser más obvio en mi verificación. O use expresiones regex o escriba una prueba más obvia.
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''))
}
Yo uso esto en VBA
Function IsLettersOnly(Value As String) As Boolean
IsLettersOnly = Len(Value) > 0 And Not UCase(Value) Like "*[!A-Z]*"
End Function
La respuesta de IsCharAlphaA de IsCharAlphaA
está cerca. El mejor método es usar la versión W así:
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
Por supuesto, todo esto rara vez importa ya que todos los controles de VB6 son solo ANSI
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