Ver Mensaje Individual
  #5 (permalink)  
Antiguo 24/09/2009, 18:08
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 9 meses
Puntos: 29
Respuesta: Saber si una cadena está en mayuscula

He buscado en el foro un poco por encima a ver si encontraba algo parecido a esto pero no ha sido así, y como creo que puede interesar a alguien voy a permitirme comentaros mis experiencias.

Hoy revisando algo (que he dejado a medias, por cierto), me he quedado ensimismado precisamente con una función que hice hace tiempo para distinguir entre mayúsculas y minúsculas.

Muchos de los que hayan intentado hacer esto habrán pasado por fases muy parecidas a las que yo he pasado, intentando primero comparar todas las letras, luego las acentuadas, las eñes, etc... y otros métodos, como uno que se me ocurrió, que fue meter todas las posibles letras en una cadena y con instr() saber si la letra esta en la lista o no, y otros métodos liosos.

El caso es que todas las funciones que creaba, o tenían demasiado código o no tenian en cuenta detalles como caracteres de puntuación, espacios en blanco, cadenas vacías, etc.

Pues hoy, después de intentar varias modificaciones más y cuando ya menos lo esperaba, he caido en esta solución.

Creo que cumple todas las reglas básicas:
Admite caracteres sueltos o cadenas completas.
Si le dás una cadena vacía devuelve False
Ignora cualquier caracter que no sea una letra, devolviendo True solamente en el caso de que la cadena contenga letras y todas ellas sean mayúsculas.

P.ej: "ESTA CADENA, ESTÁ EN MAYÚSCULAS." devuelve True.

¡Y todo ello en una sola línea de 2 comparaciones!

Cadena <> LCase$(Cadena)) And (Cadena = UCase$(Cadena)

Si lo metemos en una función sería algo como:


Código :
Ver original
  1. Function EsMayuscula(ByVal Cadena As String) As Boolean
  2.   EsMayuscula = (Cadena <> LCase$(Cadena)) And (Cadena = UCase$(Cadena))
  3. End Function

Y para las minúsculas pues:

Código :
Ver original
  1. Function EsMinuscula(ByVal Cadena As String) As Boolean
  2.   EsMinuscula = (Cadena <> UCase$(Cadena)) And (Cadena = LCase$(Cadena))
  3. End Function

Irónicamente, aún cuando la función no tiene en cuenta si en el texto que le envias hay solo letras o hay también caracteres que no son letras, resulta que cualquiera de las dos se puede usar para saber si un caracter suelto es una letra o no:

Código :
Ver original
  1. EsLetra = EsMayuscula (Ucase$(Caracter))

Si es una letra, la funcion devuelve True por que le llega una letra mayuscula
Si no es letra devuelve False al no encontrar ninguna letra.


Por otro lado, si lo que quereis de la función es conseguir un False cuando, por ejemplo, la cadena mandada contenga algún caracter que no sea estrictamente una letra mayúscula, pues de momento solo se me ocurre que hagais un bucle y comprobeis la cadena letra a letra.
Las funciones podrían quedar así:

Código :
Ver original
  1. Public Function EsMayusculaEstrict(ByVal Cadena As String) As Boolean
  2.   Dim F As Long
  3.   For F = 1 To Len(Cadena)
  4.     EsMayusculaEstrict = (Mid$(Cadena, F, 1) <> LCase$(Mid$(Cadena, F, 1))) And (Mid$(Cadena, F, 1) = UCase$(Mid$(Cadena, F, 1)))
  5.     If EsMayusculaEstrict = False Then Exit For
  6.   Next F
  7. End Function
  8.  
  9.  
  10. Public Function EsMinusculaEstrict(ByVal Cadena As String) As Boolean
  11.   Dim F As Long
  12.   For F = 1 To Len(Cadena)
  13.     EsMinusculaEstrict = (Mid$(Cadena, F, 1) <> UCase$(Mid$(Cadena, F, 1))) And (Mid$(Cadena, F, 1) = LCase$(Mid$(Cadena, F, 1)))
  14.     If EsMinusculaEstrict = False Then Exit For
  15.   Next F
  16. End Function


Saludos

Última edición por pkj; 29/09/2009 a las 09:30