C# Language
Manejo de FormatException al convertir cadenas a otros tipos
Buscar..
Convertir cadena a entero
Hay varios métodos disponibles para convertir explícitamente una string
a un integer
, como:
Convert.ToInt16();
Convert.ToInt32();
Convert.ToInt64();
int.Parse();
Pero todos estos métodos lanzarán una FormatException
, si la cadena de entrada contiene caracteres no numéricos. Para esto, necesitamos escribir un manejo de excepciones adicional ( try..catch
) para tratarlas 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 sorteamos esto?
Como se dijo anteriormente, para manejar las excepciones, usualmente 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, usar try..catch
todas partes no será una buena práctica, y puede haber algunos escenarios en los que quisiéramos dar 0
si la entrada es incorrecta (si seguimos el método anterior, debemos asignar 0
a convertedInt
desde el bloque de captura). Para manejar tales escenarios podemos hacer uso de un método especial llamado .TryParse()
.
El método .TryParse()
tiene un manejo interno de Excepciones, que le dará la salida al parámetro de out
y devuelve un valor booleano que indica el estado de la conversión ( true
si la conversión fue exitosa; false
si falló). Según el valor de retorno, podemos determinar el estado de conversión. Veamos un ejemplo:
Sintaxis 1: almacena el valor de retorno en una variable booleana
int convertedInt; // Be the required integer
bool isSuccessConversion = int.TryParse(inputString, out convertedInt);
Podemos verificar la variable isSuccessConversion
después de la ejecución para verificar el estado de la conversión. Si es falso, el valor de convertedInt
será 0
(no es necesario verificar el valor de retorno si desea que 0
un error de conversión).
Sintaxis 2: compruebe 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 de retorno, puede usar lo siguiente, si no le importa el valor de retorno (convertido o no, 0
estará bien)
int.TryParse(inputString, out convertedInt);
// use the value of convertedInt
// But it will be 0 if not converted