Gestione di FormatException durante la conversione di stringhe in altri tipi

Gestione di FormatException durante la conversione di stringhe in altri tipi

# Conversione di una stringa in un numero intero

Sono disponibili vari metodi per convertire in modo esplicito un string a un integer , come:

  • `Convert.ToInt16();`
  • `Convert.ToInt32();`
  • `Convert.ToInt64();`
  • `int.Parse();`
  • Ma tutti questi metodi genereranno un FormatException , se la stringa di input contiene caratteri non numerici. Per questo, abbiamo bisogno di scrivere un'ulteriore gestione delle eccezioni (try..catch ) per trattarli in tali casi.

    Spiegazione con esempi:

    Quindi, lascia che il nostro input sia:

    string inputString = "10.2";
    
    

    Esempio 1: Convert.ToInt32()

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

    Nota: Lo stesso vale per gli altri metodi citati, vale a dire - Convert.ToInt16(); e Convert.ToInt64();

    Esempio 2: int.Parse()

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

    Come possiamo aggirare questo problema?

    Come detto in precedenza, per gestire le eccezioni di solito abbiamo bisogno di un try..catch come mostrato di seguito:

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

    Ma, usando il try..catch ovunque non sarà una buona pratica e potrebbero esserci degli scenari in cui volevamo dare 0 se l'input è sbagliato, (Se seguiamo il metodo sopra, dobbiamo assegnare 0 a convertedInt dal blocco di cattura). Per gestire tali scenari possiamo utilizzare un metodo speciale chiamato .TryParse() .

    Il .TryParse() metodo con una gestione interna delle eccezioni, che ti darà l'output al out parametro e restituisce un valore booleano che indica lo stato di conversione (true se la conversione è andata a buon fine; false se ha fallito). Sulla base del valore di ritorno possiamo determinare lo stato di conversione. Vediamo un esempio:

    Utilizzo 1: Memorizza il valore restituito in una variabile booleana

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

    Possiamo controllare la variabile isSuccessConversion dopo l'Esecuzione per verificare lo stato della conversione. Se è falso, allora il valore di convertedInt sarà 0 (non c'è bisogno di controllare il valore restituito se vuoi 0 per conversione non riuscita).

    Utilizzo 2: Verifica il valore restituito con if

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

    Utilizzo 3: Senza controllare il valore restituito, puoi utilizzare quanto segue, se non ti interessa il valore restituito (convertito o meno, 0 andrà bene)

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

    No