Manejo de FormatException al convertir cadenas a otros tipos

Manejo de FormatException al convertir cadenas a otros tipos

# Convertir cadena a entero

Hay varios métodos disponibles para convertir explícitamente un string a un integer , como:

  • `Convertir.ToInt16();`
  • `Convertir.ToInt32();`
  • `Convertir.ToInt64();`
  • `int.Parse();`
  • Pero todos estos métodos arrojarán un FormatException , si la cadena de entrada contiene caracteres no numéricos. Para esto, necesitamos escribir un manejo de excepción adicional (try..catch ) para tratarlos en tales casos.

    Explicación con ejemplos:

    Entonces, dejemos que nuestra entrada sea:

    string inputString = "10.2";
    
    

    Ejemplo 1: Convert.ToInt32()

    int convertedInt = Convert.ToInt32(inputString); // Failed to Convert 
    // Throws an Exception "Input string was not in a correct format."
    
    

    Nota: Lo mismo ocurre con los otros métodos mencionados, a saber:Convert.ToInt16(); y Convert.ToInt64();

    Ejemplo 2: int.Parse()

    int convertedInt = int.Parse(inputString); // Same result "Input string was not in a correct format.
    
    

    ¿Cómo evitamos esto?

    Como se dijo anteriormente, para manejar las excepciones generalmente necesitamos un try..catch como se muestra a continuación:

    try
    {
        string inputString = "10.2";
        int convertedInt = int.Parse(inputString);
    }
    catch (Exception Ex)
    {
        //Display some message, that the conversion has failed.         
    }
    
    

    Pero, usando el try..catch en todas partes no será una buena práctica, y puede haber algunos escenarios en los que queríamos dar 0 si la entrada es incorrecta, (Si seguimos el método anterior, debemos asignar 0 a convertedInt del bloque catch). Para manejar tales escenarios podemos hacer uso de un método especial llamado .TryParse() .

    El .TryParse() método que tiene un manejo de excepciones interno, que le dará la salida al out y devuelve un valor booleano que indica el estado de la conversión (true si la conversión fue exitosa; false si falla). Según el valor devuelto, podemos determinar el estado de conversión. Veamos un ejemplo:

    Uso 1: Almacene el valor devuelto en una variable booleana

    
    int convertedInt; // Be the required integer
     bool isSuccessConversion = int.TryParse(inputString, out convertedInt);
    
    

    Podemos comprobar la variable isSuccessConversion después de la Ejecución para verificar el estado de la conversión. Si es falso entonces el valor de convertedInt será 0 (no es necesario verificar el valor de retorno si desea 0 por error de conversión).

    Uso 2: Comprueba el valor de retorno con if

    if (int.TryParse(inputString, out convertedInt))
    {
        // convertedInt will have the converted value
        // Proceed with that
    }
    else 
    {
     // Display an error message
    }
    
    

    Uso 3: Sin verificar el valor devuelto, puede usar lo siguiente, si no le importa el valor devuelto (convertido o no, 0 estará bien)

    int.TryParse(inputString, out convertedInt);
    // use the value of convertedInt
    // But it will be 0 if not converted
    
    

    No