none
¿Se puede escribir esta expresión de manera más abreviada (de cualquier forma) pero que de el mismo resultado? RRS feed

  • Pregunta

  • Dim cTiempo As String = "5"

    Dim nTiempo As Integer = 10

    Deseo abreviar la siguiente expresión (si es que se puede):

    nTiempo = If(IsNumeric(cTiempo) AndAlso (CInt(cTiempo) >= 0) AndAlso (CInt(cTiempo) <= 20, CInt(cTiempo), nTiempo)

    sábado, 8 de agosto de 2020 2:23

Respuestas

  • No, eso lo tendrías que comprobar después de convertir el valor a numérico. El TryParse lo que hace es resolverte el problema de que el IsNumeric puede fallar, y el de llamar tres veces a CInt. Pero la comprobación de que el rango esté entre 0 y 20 no vas a tener más remedio que hacerla con un If (o un Case) después de convertir el número. No creo que haya ninguna manera de abreviar esta parte.

    Dim cTiempo As String = "5"
    Dim nTiempo As Integer
    
    Dim Ok as Boolean = Integer.TryParse(cTiempo, nTiempo)
    If (Not Ok) OrElse nTiempo < 0 OrElse nTiempo > 20 Then nTiempo = 10


    sábado, 8 de agosto de 2020 17:29
  • Hola, veo que ya tienes una respuesta, si tienes alguna otra consulta no dudes en usar los foros de MSDN.

    Saludos

    jueves, 13 de agosto de 2020 16:05
    Moderador

Todas las respuestas

  • Lo primero, te recomiendo evitar el uso de "IsNumeric". Te puede contestar True, y sin embargo dar un error al llamar al CInt, orque el CInt es más restrictivo que IsNumeric,

    You sugeriría una solución 100% .Net usando TryParse, en lugar de confiar en los métodos "legacy" del antiguo VB6.

    Dim cTiempo As String = "5"
    Dim nTiempo As Integer = 10
    
    
    Dim Ok as Boolean = Integer.TryParse(cTiempo, nTiempo)
    
    

    Si quieres puedes despreciar el "Ok". Sirve para decirte si el String se consiguió convertir o no. Si no se consiguió convertir, la variable entera no cambia de valor, por lo que conserva el 10 que le metiste al principio, que es precisamente lo que hacía tu IIF. SI se consigue convertir, el valor se devuelve en nTiempo, que es un parámetro de tipo Out en el TryParse.

    sábado, 8 de agosto de 2020 9:47
  • Gracias, pero el rango, nTiempo puede tomar otros valores, pero deben estar en el rango de 0 y 20 no menores ni mayores, si el valor no cae en ese rango nTiempo debe conservar también su valor previo, cómo le introduciría esa condición al TryParse?

    En otras palabras si cTiempo es "21" por ejemplo, nTiempo debe seguir valiendo 10.


    • Marcado como respuesta James2016-2 sábado, 8 de agosto de 2020 14:25
    • Desmarcado como respuesta James2016-2 sábado, 8 de agosto de 2020 14:26
    • Editado James2016-2 sábado, 8 de agosto de 2020 14:29
    sábado, 8 de agosto de 2020 14:22
  • No, eso lo tendrías que comprobar después de convertir el valor a numérico. El TryParse lo que hace es resolverte el problema de que el IsNumeric puede fallar, y el de llamar tres veces a CInt. Pero la comprobación de que el rango esté entre 0 y 20 no vas a tener más remedio que hacerla con un If (o un Case) después de convertir el número. No creo que haya ninguna manera de abreviar esta parte.

    Dim cTiempo As String = "5"
    Dim nTiempo As Integer
    
    Dim Ok as Boolean = Integer.TryParse(cTiempo, nTiempo)
    If (Not Ok) OrElse nTiempo < 0 OrElse nTiempo > 20 Then nTiempo = 10


    sábado, 8 de agosto de 2020 17:29
  • Ah, bueno. Gracias.
    sábado, 8 de agosto de 2020 20:35
  • Hola, veo que ya tienes una respuesta, si tienes alguna otra consulta no dudes en usar los foros de MSDN.

    Saludos

    jueves, 13 de agosto de 2020 16:05
    Moderador