visual studio microsoft español descargar community c# parsing while-loop user-input

c# - studio - ¿Prueba para asegurarse de que la entrada del usuario es doble y es mayor que cero?



visual studio installer (4)

En C # estoy intentando que el usuario ingrese un número. Entonces quiero verificar eso

  1. Han ingresado una cadena que se puede convertir a un doble y
  2. Han ingresado un valor mayor que cero

El método que inicialmente creé 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;

El problema era que si el usuario ingresaba, digamos "-10" y luego "f", se produciría una excepción. Esto se debe a que el programa pasará del primer control (que verifica el doble) al valor de -10, pero luego cuando se ingresa la "f" arroja una excepción cuando solo se le da la segunda prueba.

Creo que la solución es crear una declaración while que escriba la declaración de error cuando el valor no se puede convertir a doble o el valor se convierte en doble y está por debajo de cero. Lo que no sé hacer es hacer que el valor se convierta en un doble y luego se evalúe como mayor que cero en el enunciado while.


¡Después de un poco de reagrupación está funcionando el código! pero creo que a veces necesitas usar si en vez de

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;


Estás en el camino correcto: necesitas tener un único ciclo while que obtenga la entrada y luego intente ambas validaciones. Una forma de hacerlo es crear un valor booleano que rastree si el valor es válido o no, y luego usarlo como la condición para el ciclo:

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;

También es posible poner ambas condiciones en la instrucción while, pero este enfoque le permite proporcionar un mensaje diferente dependiendo de las condiciones que fallaron.


Me gustaría ir con una solución como esta. Solo notando que no tiene que double.Parse(Value) después de haber hecho un double.TryParse(value, out outcome) el parámetro de salida poblará esa variable cuando TryParse sea verdadero.

Puede copiar y pegar el siguiente código en LinqPad y jugar con él. Pero esto hace lo que necesitas.

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; }


puedes o esas dos condiciones en tu primer ciclo while

algo como

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

alguna explicación: double.TryParse modificará el valor del resultado si es exitoso, por lo que si fue capaz de analizar el! TryParse se evaluará a falso, así llegamos a la segunda parte y evaluamos el resultado <0.