web-dev-qa-db-ja.com

C#コンソールアプリケーションへの番号入力のみを許可するにはどうすればよいですか?

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

こんにちは、キーボードボタン、A〜Z、角かっこ、疑問符などを無効にします。入力してもコンソールに表示されないようにしたいのですが。 1〜9の数字だけを表示したい。これはC#コンソールアプリケーションにあります。助けてくれてありがとう!

11
Sarah

このコードスニペットを試してください

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();
14
John Woo

このMSDNの記事 コンソールウィンドウで一度に1文字ずつ読み取る方法について説明します。 Char.IsNumber() メソッドで入力された各文字をテストし、テストに失敗した文字を拒否します。

3
Robert Harvey

これが1つのアプローチです。 C#は言語のより高度な側面を使用しているため、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関数を実装することもできますが、これは演習として残しておきます。

これを拡張できるもう1つの方法は、ReadKeysが2つのPredicate<string>パラメーターを取得することです。1つは部分文字列が有効なエントリの開始を表すかどうかを判別し、もう1つはそれが完了したかどうかを示します。そのようにして、キーを押すことを許可することはできますが、 Enter 入力が完了するまでキーを押します。これは、特定の強度を確保したいパスワード入力や、「はい」/「いいえ」の入力などに役立ちます。

1

しばらくして、私は本当に短い解決策を得ました:

double number;
Console.Write("Enter the cost of the item: ");
while (!double.TryParse(Console.ReadLine(), out number))
{
   Console.Write("This is not valid input. Please enter an integer value: ");
}

Console.Write("The item cost is: {0}", number);                          

またね!

0
yasserpulido

このコードにより、次のことが可能になります。

  • ドットを1つだけ書き込みます(数値には小数点記号を1つしか含めることができないため)。
  • 最初に1マイナス。
  • 最初に1つのゼロ。

これは、「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
Ovidzikas