Как мне разрешить ввод номера в мое консольное приложение С#?

Console.WriteLine("Enter the cost of the item");                           
         string input = Console.ReadLine();
        double price = Convert.ToDouble(input);

Здравствуйте, я хочу, чтобы кнопки клавиатуры, A-Z, скобки, вопросительный знак и т.д. были отключены. Я хочу, чтобы это было, если вы введете его, он не появится в консоли. Я только хочу, чтобы цифры 1-9 отображались. Это приложение С# Console. Спасибо за помощь!

Ответ 1

попробуйте этот фрагмент кода

string _val = "";
Console.Write("Enter your value: ");
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");
        }
    }
}
// Stops Receving Keys Once Enter is Pressed
while (key.Key != ConsoleKey.Enter);

Console.WriteLine();
Console.WriteLine("The Value You entered is : " + _val);
Console.ReadKey();

Ответ 2

В этой статье MSDN объясняется, как читать символы по одному в окне консоли. Проверяйте каждый символ, когда он вводится с помощью метода Char.IsNumber() и отклоняет те символы, которые не проходят тест.

Ответ 3

Вот один из подходов. Вероятно, это слишком сложно, если вы только начинаете работать на С#, так как он использует некоторые более продвинутые аспекты языка. В любом случае, надеюсь, вы найдете это интересным.

У него есть несколько приятных функций:

  • Метод ReadKeys принимает произвольную функцию для проверки правильности строки. Это облегчает повторное использование всякий раз, когда вы хотите отфильтровать ввод с клавиатуры (например, буквы или цифры, но без пунктуации).

  • Он должен обрабатывать все, что вы бросаете на него, которое может быть интерпретировано как двойное, например. "-123.4E77".

Однако, в отличие от ответа Джона Ву, он не обрабатывает промежутки.

Вот код:

using System;

public static class ConsoleExtensions
{
    public static void Main()
    {
        string entry = ConsoleExtensions.ReadKeys(
            s => { StringToDouble(s) /* might throw */; return true; });

        double result = StringToDouble(entry);

        Console.WriteLine();
        Console.WriteLine("Result was {0}", result);
    }

    public static double StringToDouble(string s)
    {
        try
        {
            return double.Parse(s);
        }
        catch (FormatException)
        {
            // handle trailing E and +/- signs
            return double.Parse(s + '0');
        }
        // anything else will be thrown as an exception
    }

    public static string ReadKeys(Predicate<string> check)
    {
        string valid = string.Empty;

        while (true)
        {
            ConsoleKeyInfo key = Console.ReadKey(true);
            if (key.Key == ConsoleKey.Enter)
            {
                return valid;
            }

            bool isValid = false;
            char keyChar = key.KeyChar;
            string candidate = valid + keyChar;
            try
            {
                isValid = check(candidate);
            }
            catch (Exception)
            {
                // if this raises any sort of exception then the key wasn't valid
                // one of the rare cases when catching Exception is reasonable
                // (since we really don't care what type it was)
            }

            if (isValid)
            {
                Console.Write(keyChar);
                valid = candidate;
            }        
        }    
    }
}

Вы также можете реализовать функцию IsStringOrDouble, которая возвращает false вместо того, чтобы бросать исключение, но я оставляю это как упражнение.

Другим способом, который можно было бы расширить, было бы для ReadKeys взять два параметра Predicate<string>: один, чтобы определить, представляла ли подстрока начало действительной записи, а другая - второй, чтобы сказать, была ли она завершена. Таким образом мы можем позволить нажатиям клавиш внести свой вклад, но запретить клавишу Enter, пока запись не будет завершена. Это было бы полезно для таких вещей, как ввод пароля, где вы хотите обеспечить определенную силу, или для записи "да" / "нет".

Ответ 4

Этот код позволит вам:

  • Напишите только одну точку (потому что числа могут иметь только один разделитель с разделителями);
  • Один минус в начале;
  • Один ноль в начале.

Это означает, что вы не сможете написать что-то вроде: "00000.5" или "0000... -5".

class Program
{
    static string backValue = "";
    static double value;
    static ConsoleKeyInfo inputKey;

    static void Main(string[] args)
    {
        Console.Title = "";
        Console.Write("Enter your value: ");

        do
        {
            inputKey = Console.ReadKey(true);

            if (char.IsDigit(inputKey.KeyChar))
            {
                if (inputKey.KeyChar == '0')
                {
                    if (!backValue.StartsWith("0") || backValue.Contains('.'))
                        Write();
                }

                else
                    Write();
            }

            if (inputKey.KeyChar == '-' && backValue.Length == 0 ||
                inputKey.KeyChar == '.' && !backValue.Contains(inputKey.KeyChar) &&
                backValue.Length > 0)
                Write();

            if (inputKey.Key == ConsoleKey.Backspace && backValue.Length > 0)
            {
                backValue = backValue.Substring(0, backValue.Length - 1);
                Console.Write("\b \b");
            }
        } while (inputKey.Key != ConsoleKey.Enter); //Loop until Enter key not pressed

        if (double.TryParse(backValue, out value))
            Console.Write("\n{0}^2 = {1}", value, Math.Pow(value, 2));

        Console.ReadKey();
    }

    static void Write()
    {
        backValue += inputKey.KeyChar;
        Console.Write(inputKey.KeyChar);
    }
}

Ответ 5

        string input;
        double price;
        bool result = false;

        while ( result == false )
            {
            Console.Write ("\n Enter the cost of the item : ");
            input = Console.ReadLine ();
            result = double.TryParse (input, out price);
            if ( result == false )
                {
                Console.Write ("\n Please Enter Numbers Only.");
                }
            else
                {
                Console.Write ("\n cost of the item : {0} \n ", price);
                break;
                }
            }