1

ああ、2 つのこと: 1) コンソール アプリケーションです。2)デンマーク語であることは知っていますが、実際には問題ではありません。入力を求める例にすぎません。テキストと変数は関係ありません。

さて、この単純な入力を考えてみましょう。これは、実際にはあらゆる種類の入力質問である可能性があります。

Console.WriteLine("Hvad er dit kundenummer: (Kun hele tal tilladt)");
string inputKnr = Console.ReadLine();
kundenummer = Convert.ToInt16(inputKnr);

では、顧客が何か間違ったことを入力した場合はどうなるでしょうか。手紙など。try & catch はアプリケーションが壊れないことを確認しますが、それは私が望む解決策ではありません。あなたが間違ったことをしたと言いたいので、もう一度やり直してください。かなりクラシックですよね?

しかし、この解決策を解決する最善の方法は何ですか? 私はこれについて考えました:

bool fangetKundenummer = true;
while (fangetKundenummer)
{
Console.WriteLine("Hvad er dit kundenummer: (Kun hele tal tilladt)");
string inputKnr = Console.ReadLine();
try
{
    kundenummer = Convert.ToInt16(inputKnr);
    fangetKundenummer = false;
}
catch
{
    Console.WriteLine("Fejl. Prøv igen");
}
}

しかし、それは正しい方法ではないようです。

また、私が遊んでいるこの小さなアプリケーションには、4 つの入力質問が連続しています。これは、この厄介な while() ループの 4 倍を意味します。

関数を書くこともできます。このようなもの(正しい方法で行う理由はありません。概念を説明するためだけです):

static void verifyInput()
{
    try
    {
        Console.WriteLine("question");
        input = Console.ReadLine();
        kundenummer = Convert.ToInt16(input)
    }
    catch
    {
        Console.WriteLine("Wrong. Do it over");
        verifyInput(); //start the function all over
    }
}

しかし、入力の質問ごとに関数を作成する必要があります。(おそらくすべて整数を要求することを意味しますが、質問と変数が異なります)。

これは while() ソリューションよりも優れているようには見えません。

誰かが賢い考えを持っていますか?

4

4 に答える 4

9

Int16.TryParseおよびその他の数値型の同等のものを使用します。これらはすべて、解析の成功または失敗を示すブール値の結果を返し、解析outの結果 (失敗の場合は 0) に設定されたパラメーターを取ります。あなたの場合、呼び出しをメソッドでラップして、プロンプトを表示し続けることができます。

static Int16 PromptForInt16(string prompt)
{
    while (true)
    {
        Console.Write(prompt);
        Int16 result;
        if (Int16.TryParse(Console.ReadLine(), out result))
        {
            return result;
        }
        Console.WriteLine("Sorry, invalid number entered. Try again.");
    }
}
于 2009-02-02T14:32:21.210 に答える
3

TryParse パターンを使用できます。

string s; // for "is not valid" message
short val; // final value
while(!short.TryParse(s=Console.ReadLine(), out val)) {
    Console.WriteLine(s + " is not valid...");
}
于 2009-02-02T14:34:36.477 に答える
1

いくつかのバリエーションのために、TryParse の代わりに文字列自体をテストしてみてはどうでしょうか?

static void Main(string[] args)
{
    var isFalse = "t".IsInt();
    var isTrue = "123".IsInt();
    var isAlsoFalse = "123.1".IsInt();

}

static bool IsInt(this IEnumerable<char> s)
{
    return s.All(x => char.IsNumber(x));
}
于 2009-02-02T14:53:24.677 に答える
0

役立つリンクは次のとおりです。

http://msdn.microsoft.com/en-us/library/system.int16.tryparse.aspx

于 2009-02-02T14:33:08.540 に答える