2016-05-28 44 views
6

In C# sto provando a fare in modo che l'utente inserisca un numero. Allora voglio controllare cheVerificare che l'input dell'utente sia doppio ed è maggiore di zero?

  1. Essi sono entrati in una stringa che può essere convertito in un doppio e
  2. Hanno inserito un valore maggiore di zero

Il metodo che ho creato inizialmente era

string inValue; 
double outcome; 

Console.WriteLine("Enter amount: "); 
inValue = Console.ReadLine(); 
while (double.TryParse(inValue, out outcome) == false) 
{ 
    Console.WriteLine("Initial value must be of the type double"); 
    Console.WriteLine("\nPlease enter the number again: "); 
    inValue = Console.ReadLine(); 
} 
outcome = double.Parse(inValue); 
while (outcome < 0) 
{ 
    Console.WriteLine("Initial value must be of at least a value of zero"); 
    Console.WriteLine("\nPlease enter the number again: "); 
    inValue = Console.ReadLine(); 
    outcome = double.Parse(inValue); 
} 
return outcome; 

Il problema era che se l'utente immesso diceva "-10" e quindi "f" si sarebbe verificata un'eccezione. Questo perché il programma passerebbe oltre il primo controllo (che controlla il doppio) per il valore di -10, ma quando viene inserita la "f" genera un'eccezione quando viene dato solo il secondo test.

Credo che la soluzione sia creare un'istruzione while che scriva l'errore quando il valore non può essere convertito in double o il valore viene convertito in double ed è inferiore a zero. Quello che non so come fare è avere il valore convertito in double e poi valutato come maggiore di zero all the while statement.

risposta

7

Sei sulla strada giusta: devi avere un singolo ciclo while che ottiene l'input e quindi prova entrambe le convalide. Un modo per farlo è quello di creare un valore booleano che tiene traccia se il valore è valido, e quindi utilizzare tale come condizione per il loop:

double outcome = 0; 
bool valid = false; 

while (!valid) 
{ 
    Console.WriteLine("Enter amount: "); 
    string inValue = Console.ReadLine(); 
    if (double.TryParse(inValue, out outcome) == false) 
    { 
     Console.WriteLine("Initial value must be of the type double"); 
     Console.WriteLine("\nPlease enter the number again: "); 
    } 
    else if (outcome < 0) 
    { 
     Console.WriteLine("Initial value must be of at least a value of zero"); 
     Console.WriteLine("\nPlease enter the number again: "); 
    } 
    else 
    { 
     valid = true; 
    } 
} 
return outcome; 

E 'anche possibile mettere entrambe le condizioni nella dichiarazione, mentre , ma questo approccio ti consente di fornire un messaggio diverso a seconda delle condizioni non riuscite.

+6

È più idiomatico usare '! Condition' invece di' condition == false'. Capisco che tu abbia mantenuto il codice il più simile all'originale possibile, ma ti sto solo segnalando per riferimento futuro. – Kroltan

6

si può o queste due condizioni nel primo ciclo while

qualcosa come

while (!double.TryParse(inValue, out outcome) || outcome < 0) 
{ 
    ... 
} 

qualche spiegazione: Double.TryParse sarà modificare il valore di esito se è successo, quindi se è stato in grado analizzare quindi il! TryParse verrà valutato come falso, quindi arriveremo alla seconda parte e valuteremo il risultato < 0.

+1

La domanda però è ciò che sarà '...'. Usando il tuo approccio, come formerà il messaggio di errore? –

+0

@IvanStoev Il valore iniziale deve essere doppio e maggiore di zero – Steve

+0

Ciò è possibile, ma non equivalente a OP. –

0

dopo un po 'di raggruppamento sta funzionando codice! ma penso che a volte è necessario usare se invece di mentre

string inValue = ""; 
    double outcome = -1; 

    Console.WriteLine("Enter amount: "); 
    while (outcome < 0){ 
     inValue = Console.ReadLine(); 

     if (double.TryParse(inValue, out outcome) == false) 
     { 
     Console.WriteLine("Initial value must be of the type double"); 
     Console.WriteLine("\nPlease enter the number again: "); 
     continue; 
     } 
     if (outcome>=0) {continue;} 
     Console.WriteLine("Initial value must be of at least a value of zero"); 
     Console.WriteLine("\nPlease enter the number again: "); 
    } 
    return outcome; 
+0

Downvoted per 1) non rimuovendo la chiamata ridondante a double.Parse e 2) awent, * awful * indentation. –

+0

l'ho rimosso grazie per averlo notato – prizm1

2

vorrei andare con una soluzione come questa. Notando che non è necessario dopo aver eseguito uno double.TryParse(value, out outcome), il parametro out popolerà quella variabile sul TryParse che è true.

È possibile copiare e incollare il codice seguente in LinqPad e giocare con esso. Ma questo fa quello che ti serve.

void Main() 
{ 
    var result = DoWork(); 
    Console.WriteLine(result); 
} 

public double DoWork() 
{ 
    string inValue; 
    double outcome; 

    Console.WriteLine("Enter amount: "); 
    inValue = Console.ReadLine(); 
    while (!double.TryParse(inValue, out outcome) || outcome <= 0) 
    { 
     Console.WriteLine("Initial value must be of the type double and greater than 0"); 
     Console.WriteLine("\nPlease enter the number again: "); 
     inValue = Console.ReadLine(); 
    } 
    return outcome; 
}