C#でreadlineの入力を検証するための最良の方法?
質問
ああ、2つのこと: 1)これは、コンソールアプリケーションです。 2)私はそれがデンマーク語である知っているが、それは本当に、いくつかの入力を求めるのそのわずか例を重要ではありません。テキストと変数は関係ありません。
さてさて、この単純な入力を考慮してください。 それは本当に入力質問の任意の並べ替え可能性があります。
Console.WriteLine("Hvad er dit kundenummer: (Kun hele tal tilladt)");
string inputKnr = Console.ReadLine();
kundenummer = Convert.ToInt16(inputKnr);
さて、どのような顧客のタイプに何か間違っている場合は?このような手紙など。 トライ&キャッチは、アプリケーションが壊れないことを確認してくださいだろうが、それは私が望むソリューションではありません。 私はそれはあなたはそれが間違っていたことを言いたい、もう一度試してください。 かなり古典的な右?
しかし、このソリューションを解決するための最良の方法は何ですか?私はこの考えています:
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入力質問を持っています。これは、この厄介なしばらく()ループ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
}
}
しかし、あなたは、彼らが同じため、正確に頼むかもしれないにも関わらず、それぞれ、すべての入力質問のための関数を書く必要があるだろう! (すべての整数を求め、おそらく意味、別の質問や変数ではなく)。
このはしばらく()ソリューションよりもはるかに優れていないようです。
誰もが巧妙なアイデアを持っていますか?
解決
Int16.TryParse と同等を使用してください他の数値型のため。これらのすべては、解析のための成功または失敗を示し、(障害が発生した場合には0)の解析の結果に設定されているout
パラメータを取るために、ブール結果を返します。あなたのケースでは、プロンプトを維持する方法で呼び出しをラップする必要があります:
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.");
}
}
他のヒント
あなたは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...");
}
ただ、いくつかのさまざまな、どのように余分なストレージ、および潜在的に不要なキャストが必要と思われる、代わりに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));
}
ここでは役立つかもしれないリンクです。
http://msdn.microsoft.com/en -us /ライブラリ/ system.int16.tryparse.aspxする