web-dev-qa-db-ja.com

コンソール入力を整数として検証するにはどうすればよいですか?

私は自分のコードを書きましたが、アルファベットではなく整数のみを入力できるように検証したいと思います。ここにコードがあります、私はあなたが私を助けるのを愛します。ありがとう。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace minimum
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = Convert.ToInt32(Console.ReadLine());
            int b = Convert.ToInt32(Console.ReadLine());
            int c = Convert.ToInt32(Console.ReadLine());

            if (a < b)
            {
                if (a < c)
                {
                    Console.WriteLine(a + "is the minimum number");
                }
            }
            if (b < a)
            {
                if (b < c)
                {
                    Console.WriteLine(b + "is the minimum number");
                }
            }
            if (c < a)
            {
                if (c < b)
                {
                    Console.WriteLine(c + "is the minimum number");
                }
            }


            Console.ReadLine();
        }
    }
}
9
SIMI

すぐに変換するのではなく、intかどうかをテストする必要があります。次のようなものを試してください:

string line = Console.ReadLine();
int value;
if (int.TryParse(line, out value))
{
   // this is an int
   // do you minimum number check here
}
else
{
   // this is not an int
}
15
zov

Readline()を呼び出し、ユーザーが有効な番号を入力するまでInt.TryParseでループするだけです:)

int X;

String Result = Console.ReadLine();

while(!Int32.TryParse(Result, out X))
{
   Console.WriteLine("Not a valid number, try again.");

   Result = Console.ReadLine();
}

お役に立てば幸いです

10
Machinarius

コンソールでアルファベット順のキーストロークを除外するには、入力の解析を引き継ぐ必要があります。 Console.ReadKey()メソッドはこれの基本であり、押されたキーをスニッフィングできます。実装例は次のとおりです。

    static string ReadNumber() {
        var buf = new StringBuilder();
        for (; ; ) {
            var key = Console.ReadKey(true);
            if (key.Key == ConsoleKey.Enter && buf.Length > 0) {
                return buf.ToString() ;
            }
            else if (key.Key == ConsoleKey.Backspace && buf.Length > 0) {
                buf.Remove(buf.Length-1, 1);
                Console.Write("\b \b");
            }
            else if ("0123456789.-".Contains(key.KeyChar)) {
                buf.Append(key.KeyChar);
                Console.Write(key.KeyChar);
            }
            else {
                Console.Beep();
            }
        }
    }

たとえば、Enterキーを検出するif()ステートメントにDecimal.TryParse()を追加して、入力された文字列がまだ有効な数値であることを確認できます。そうすれば、「1-2」のような入力を拒否できます。

9
Hans Passant
        string Temp;
        int tempInt,a;
        bool result=false;
        while ( result == false )
            {
            Console.Write ("\n Enter A Number : ");
            Temp = Console.ReadLine ();
            result = int.TryParse (Temp, out tempInt);
            if ( result == false )
                {
                Console.Write ("\n Please Enter Numbers Only.");
                }
            else
                {
                a=tempInt;
                break;
                }
            }
1
Sushrut Bhosale

ご了承ください

if (a < b) {
    if (a < c) {

と同等です

if (a < b && a < c) {

また、この後者の形式では、特にコードがより複雑になる場合に、ネストが少なくなり、読みやすくなります。また、おそらく決してConvert.ToInt32を使用する必要があります-それは特に誤解された驚くべきコーナーケースを持っています。また、可能な場合は優れた選択肢であるint.Parse、または文字列が有効かどうかわからない場合はint.TryParseよりもタイプセーフではありません。基本的に、可能な限りConvert....は避けてください。

1
Eamon Nerbonne

ユーザーからの入力をすぐに変換しないでください。文字列に入れ、Int32.TryParse(...)を使用して、数値が入力されたかどうかを確認します。このような:

int i;
string input = Console.ReadLine();
if(Int32.TryParse(input, out i))
{
    // it is a number and it is stored in i
}
else
{
    // it is not a number
}
1
Erno

Double/Float:

@Hans Passantの回答を拡張しています(DecimalSeparatorと "-"の世話をしています):

    static double ReadNumber()
    {
        var buf = new StringBuilder();
        for (; ; )
        {
            var key = Console.ReadKey(true);
            if (key.Key == ConsoleKey.Enter && buf.Length > 0)
            {
                Console.WriteLine();
                return Convert.ToDouble(buf.ToString());
            }
            else if (key.Key == ConsoleKey.Backspace && buf.Length > 0)
            {
                buf.Remove(buf.Length - 1, 1);
                Console.Write("\b \b");
            }
            else if (System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator.Contains(key.KeyChar) && buf.ToString().IndexOf(System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator) == -1)
            {
                buf.Append(key.KeyChar);
                Console.Write(key.KeyChar);
            }
            else if ("-".Contains(key.KeyChar) && buf.ToString().IndexOf("-") == -1 && buf.ToString() == "")
            {
                buf.Append(key.KeyChar);
                Console.Write(key.KeyChar);
            }
            else if ("0123456789".Contains(key.KeyChar))
            {
                buf.Append(key.KeyChar);
                Console.Write(key.KeyChar);
            }
            else
            {
                Console.Beep();
            }
        }
    }
0
user3550499

私の好ましい解決策は次のとおりです。

static void Main()
{
    Console.WriteLine(
        (
            from line in Generate(()=>Console.ReadLine()).Take(3)
            let val = ParseAsInt(line)
            where val.HasValue
            select val.Value
        ).Min()
    );
}
static IEnumerable<T> Generate<T>(Func<T> generator) { 
   while(true) yield return generator(); 
}
static int? ParseAsInt(string str) {
   int retval; 
   return int.TryParse(str,out retval) ? retval : default(int?); 
}

もちろん、仕様によっては(無効な番号を再試行する必要がありますか?)、微調整が必​​要になる場合があります。

0
Eamon Nerbonne