none
¿Cómo indicar de forma abreviada un conjunto de caracteres? RRS feed

Respuestas

  • Puedes definir una cadena y utilizar el método ToCharArray:

    Dim caracteres As Char() = "ABCD".ToCharArray()

    Si son muchos y con códigos ASCII consecutivos también podrías utilizar el método Range de la clase Enumerable para crear una lista de los códigos ASCII y convertirlos después a caracteres:

    Dim caracteres = Enumerable.Range(Asc("A"), 4).Select(Function(c) Chr(c)).ToArray()


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta James-2016 domingo, 24 de enero de 2016 20:11
    viernes, 22 de enero de 2016 6:31
  • Como te decía lo puedes hacer con expresiones regulares:

            Dim isLetterRegEx As New Regex("[A-Z|Ñ]", RegexOptions.IgnoreCase)
            If isLetterRegEx.IsMatch(caracter) Then
                ' El caracter es una letra
            End If
    


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta James-2016 domingo, 24 de enero de 2016 20:12
    viernes, 22 de enero de 2016 6:51
  • Pero entiendo que además de la tecla de retroceso también querrás mantener la funcionalidad de otras teclas como las flechas o el suprimir.

    Lo que puedes hacer es controlar todas las teclas de control con el método IsControl de la clase Char:

        Private ReadOnly isLetterRegEx As New Regex("[A-Z|Ñ]", RegexOptions.IgnoreCase)
    
        Private Sub txtNombre_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtNombre.KeyPress
    
            e.Handled = Not Char.IsControl(e.KeyChar) AndAlso Not isLetterRegEx.IsMatch(e.KeyChar)
    
        End Sub

    Como ves he sacado fuera del controlador de evento la definición de la expresión regular. Es preferible que lo hagas así, la creación de un objeto Regex suele ser un proceso bastante pesado. Si sacas la creación fuera del controlador únicamente se creará una vez cuando creas el formulario, mientras que si está dentro se creará cada vez que se pulse una tecla en el TextBox.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta James-2016 viernes, 22 de enero de 2016 7:20
    viernes, 22 de enero de 2016 7:13
  • Gracias!!! ahora sí quedó.

    La última qué diferencia hay entre usar AndAlso que usar simplemente And.

    Cuando utilizas And se evalúan las dos condiciones y si las dos se cumplen devuelve True y si no False.

    Con AndAlso se evalúa la primera condición si no se cumple devuelve False, si se cumple evalúa la segunda condición y si se cumple devuelve True, si no False. Es decir, la segunda condición sólo se evalúa si se cumple la primera.

    AndAlso  tiene un mejor rendimiento ya que únicamente evalúa la segunda condición en caso necesario. En general es mejor utilizar esta opción salvo que sea necesario que se evalúen ambas condiciones.

    AndAlso también puede servir para evitar errores. Por ejemplo:

    If miObjeto IsNot Nothing And miObjeto.valor > 10 Then
    ....
    
    If miObjeto IsNot Nothing AndAlso miObjeto.valor > 10 Then

    La primera instrucción dará error cuando miObjeto es Nothing ya que al intentar evaluar si miObjeto.valor es mayor que 10 generará un error.

    La segunda instrucción no dará error ya que, al no cumplirse la primera condición, la segunda no se evalúa.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta James-2016 domingo, 24 de enero de 2016 20:13
    sábado, 23 de enero de 2016 11:25

Todas las respuestas

  • Puedes definir una cadena y utilizar el método ToCharArray:

    Dim caracteres As Char() = "ABCD".ToCharArray()

    Si son muchos y con códigos ASCII consecutivos también podrías utilizar el método Range de la clase Enumerable para crear una lista de los códigos ASCII y convertirlos después a caracteres:

    Dim caracteres = Enumerable.Range(Asc("A"), 4).Select(Function(c) Chr(c)).ToArray()


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta James-2016 domingo, 24 de enero de 2016 20:11
    viernes, 22 de enero de 2016 6:31
  • Esa definición de rangos de caracteres sí puedes hacerla en expresiones regulares.

    Dependiendo de para qué quieras usarlo podría serte útil.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    viernes, 22 de enero de 2016 6:34
  • En realidad quiero definir el alfabeto entero de la A hasta la Z

    Aquí encontré esta funcion con la que podria determinar si un caracter es una letra:

    Char.IsLetter(Caracter)

    lo malo que incluye letras acentuadas, con diéresis, etc. y yo lo que quiero es solo el alfabeto y a lo mas la ñ, Ñ.

    El segundo código que me da, me sirve, solo que está un poco complejo, no hay un operador que permita definir el rango u otro código alternativo?

    viernes, 22 de enero de 2016 6:39
  • Como te decía lo puedes hacer con expresiones regulares:

            Dim isLetterRegEx As New Regex("[A-Z|Ñ]", RegexOptions.IgnoreCase)
            If isLetterRegEx.IsMatch(caracter) Then
                ' El caracter es una letra
            End If
    


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta James-2016 domingo, 24 de enero de 2016 20:12
    viernes, 22 de enero de 2016 6:51
  • Gracias, ese código me convence más. Quiero impedir que se pulsen ciertos caracteres en un control de texto.

    En el evento KeyPres pondria:

    Private Sub txtNombre_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtNombre.KeyPress

    Dim isLetterRegEx As New Regex("[A-Z|Ñ]", RegexOptions.IgnoreCase)

      e.handled = not isLetterRegEx.IsMatch(e.keychar)

    End Sub


    Ahora el problema es que no puedo usar la tecla retroceso (creo que el código es 8) para borrar caracteres

    cómo haría para definirlo en el subconjunto? algo asi como

    Dim isLetterRegEx As New Regex("[A-Z|Ñ|chr(8)]", RegexOptions.IgnoreCase)

    o añadirlo en esta linea, algo asi como:

    e.handled = not isLetterRegEx.IsMatch(e.keychar) and not is.char(8)

    como seria el codigo correcto de la parte subrayada?


    • Editado James-2016 viernes, 22 de enero de 2016 7:07
    viernes, 22 de enero de 2016 7:04
  • Pero entiendo que además de la tecla de retroceso también querrás mantener la funcionalidad de otras teclas como las flechas o el suprimir.

    Lo que puedes hacer es controlar todas las teclas de control con el método IsControl de la clase Char:

        Private ReadOnly isLetterRegEx As New Regex("[A-Z|Ñ]", RegexOptions.IgnoreCase)
    
        Private Sub txtNombre_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtNombre.KeyPress
    
            e.Handled = Not Char.IsControl(e.KeyChar) AndAlso Not isLetterRegEx.IsMatch(e.KeyChar)
    
        End Sub

    Como ves he sacado fuera del controlador de evento la definición de la expresión regular. Es preferible que lo hagas así, la creación de un objeto Regex suele ser un proceso bastante pesado. Si sacas la creación fuera del controlador únicamente se creará una vez cuando creas el formulario, mientras que si está dentro se creará cada vez que se pulse una tecla en el TextBox.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta James-2016 viernes, 22 de enero de 2016 7:20
    viernes, 22 de enero de 2016 7:13
  • Gracias!!! ahora sí quedó.

    La última qué diferencia hay entre usar AndAlso que usar simplemente And.

    viernes, 22 de enero de 2016 7:20
  • Gracias!!! ahora sí quedó.

    La última qué diferencia hay entre usar AndAlso que usar simplemente And.

    Cuando utilizas And se evalúan las dos condiciones y si las dos se cumplen devuelve True y si no False.

    Con AndAlso se evalúa la primera condición si no se cumple devuelve False, si se cumple evalúa la segunda condición y si se cumple devuelve True, si no False. Es decir, la segunda condición sólo se evalúa si se cumple la primera.

    AndAlso  tiene un mejor rendimiento ya que únicamente evalúa la segunda condición en caso necesario. En general es mejor utilizar esta opción salvo que sea necesario que se evalúen ambas condiciones.

    AndAlso también puede servir para evitar errores. Por ejemplo:

    If miObjeto IsNot Nothing And miObjeto.valor > 10 Then
    ....
    
    If miObjeto IsNot Nothing AndAlso miObjeto.valor > 10 Then

    La primera instrucción dará error cuando miObjeto es Nothing ya que al intentar evaluar si miObjeto.valor es mayor que 10 generará un error.

    La segunda instrucción no dará error ya que, al no cumplirse la primera condición, la segunda no se evalúa.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta James-2016 domingo, 24 de enero de 2016 20:13
    sábado, 23 de enero de 2016 11:25