简体   繁体   中英

How do I tell my console app not to continue until i enter a number?

static int beverageSelection()
{
    Console.WriteLine();

    int brand;

    string _val = "";
    Console.Write("Enter number: ");
    ConsoleKeyInfo key;
    do
    {
        key = Console.ReadKey(true);
        if (key.Key != ConsoleKey.Backspace)
        {
            double val = 0;
            bool _x = double.TryParse(key.KeyChar.ToString(), out val);
            if (_x)
            {
                _val += key.KeyChar;
                Console.Write(key.KeyChar);
            }
        }
        else
        {
            if (key.Key == ConsoleKey.Backspace && _val.Length > 0)
            {
                _val = _val.Substring(0, (_val.Length - 1));
                Console.Write("\b \b");
            }
        }
    }
    while (key.Key != ConsoleKey.Enter);

    brand = Convert.ToInt32(Console.ReadLine());

    return brand;
}

The method above is giving me a headache. I cannot figure out how to tell the console app that it shouldn't let me input any character or even the enter button until I have typed a number into the console. Then and only then should I be able to press enter. In any case this program is a vending machine I created for fun and I do not fully understand the do while loop in this code just to be clear.

Use Console.ReadLine instead of Console.ReadKey :

int brand = 0;
while (true)
{
    string val = Console.ReadLine();
    if (int.TryParse(val, out brand)) break;
}

Improved your original code to display and accept only numbers

    static void Main(string[] args)
    {
        Console.WriteLine();

        int brand;

        string _val = "";
        Console.Write("Enter number: ");
        while(true)
        {
            var key = Console.ReadKey(true);
            if (key.Key == ConsoleKey.Enter && int.TryParse(_val, out brand))
            {
                Console.WriteLine();
                break;
            }
            if (key.Key != ConsoleKey.Backspace)
            {
                int val;
                if (int.TryParse(key.KeyChar.ToString(), out val))
                {
                    _val += key.KeyChar;
                    Console.Write(key.KeyChar);
                }
            }
            else
            {
                if (_val.Length > 0)
                {
                    _val = _val.Substring(0, _val.Length - 1);
                    Console.Write("\b \b");
                }
            }
        }

        Console.WriteLine("Brand: {0}", brand);
        Console.ReadKey();
    }

For the sake of completeness, if anyone wants the console to prevent non-numeric characters until a numeric value is chosen, you can simply use this unerring code to accomplish your task:

int inputBoundary = Console.CursorLeft;
string consoleInput = String.Empty;
ConsoleKeyInfo inputKey;
while((inputKey = Console.ReadKey(true)).Key != ConsoleKey.Enter || consoleInput == String.Empty)
{
    if (inputKey.Key == ConsoleKey.Backspace && Console.CursorLeft != inputBoundary)
    {
        Console.Write("\b \b");
        consoleInput = consoleInput.Remove(consoleInput.Length - 1);
        continue;
    }
    if (Char.IsNumber(inputKey.KeyChar))
    {
        Console.Write(inputKey.KeyChar);
        consoleInput += inputKey.KeyChar;
    }
}
int selection = Int32.Parse(consoleInput);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM