问题 我如何只允许将数字输入到我的C#控制台应用程序中?


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

您好,我希望禁用键盘按钮,A-Z,支架,问号等。我想要它,所以如果你输入它,它将不会出现在控制台中。我只希望数字1-9出现。这是在C#Console应用程序中。谢谢您的帮助!


3201
2017-10-28 05:00


起源



答案:


试试这段代码

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();

13
2017-10-28 05:08



我根据你的需要在网上修改了一些代码。无论如何,欢迎来到stackOverFlow! - John Woo
我回头看了这个,它帮助我另一个问题。随着我学习更多C#,我更了解你在做什么。在了解所有这一切之前,我还有很长的路要走! - Sarah
@ 491243我测试了你的时尚代码片段。为了让它按照您的意图正确工作,它 必须遵循 通过 Console.WriteLine(); 最后。起初我错过了那个,花了我1个小时来弄清楚出了什么问题。好的代码! - aspiring
您可以通过添加一些有助于解释代码工作方式和原因的其他注释来改进此答案。我最终通过玩它来搞清楚它,但仍然...例如,布尔参数值的事实 true 在 Console.ReadKey(true); 是必要的,以防止显示其他键。 - rory.ap


答案:


试试这段代码

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();

13
2017-10-28 05:08



我根据你的需要在网上修改了一些代码。无论如何,欢迎来到stackOverFlow! - John Woo
我回头看了这个,它帮助我另一个问题。随着我学习更多C#,我更了解你在做什么。在了解所有这一切之前,我还有很长的路要走! - Sarah
@ 491243我测试了你的时尚代码片段。为了让它按照您的意图正确工作,它 必须遵循 通过 Console.WriteLine(); 最后。起初我错过了那个,花了我1个小时来弄清楚出了什么问题。好的代码! - aspiring
您可以通过添加一些有助于解释代码工作方式和原因的其他注释来改进此答案。我最终通过玩它来搞清楚它,但仍然...例如,布尔参数值的事实 true 在 Console.ReadKey(true); 是必要的,以防止显示其他键。 - rory.ap


这篇MSDN文章 解释了如何在控制台窗口中一次读取一个字符。用输入来测试每个字符的输入 Char.IsNumber() 方法,并拒绝那些未通过测试的字符。


3
2017-10-28 05:07



那很酷!我从来不知道 Console.KeyAvailable - Scott Chamberlain


这是一种方法。如果你刚刚开始使用C#,这可能有点过头了,因为它使用了该语言的一些更高级的方面。无论如何,我希望你觉得它很有趣。

它有一些不错的功能:

  • ReadKeys 方法采用任意函数来测试到目前为止的字符串是否有效。这样,只要您想要从键盘输入过滤输入(例如字母或数字但没有标点符号),就可以轻松重复使用。

  • 它应该处理你抛出的任何可以被解释为双重的东西,例如“-123.4E77”。

然而,与John Woo的答案不同,它不处理退格。

这是代码:

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> 参数:一个用于确定子字符串是表示有效条目的开头还是第二个表示是否完成。通过这种方式,我们可以让按键作出贡献,但不允许按键 输入 密钥直到输入完成。这对于您想要确保一定强度的密码输入或“是”/“否”输入等内容非常有用。


1
2017-10-28 13:33





此代码允许您:

  • 只写一个点(因为数字只能有一个小数分隔符);
  • 一开始就减去;
  • 一开始就是零。

这意味着您无法编写类似“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);
    }
}

0
2017-11-28 19:42





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

-1
2017-08-11 06:42



我希望禁用键盘按钮,A-Z,支架,问号等。我想要它,所以如果你输入它,它将不会出现在控制台中。我只希望数字1-9出现。 这没有做到这些。 - Rawling