HOWTO · Csharp
C# でコンソールから整数を読み取る
C# でコンソールから整数値を読み取るために使用できる 3つの主要なメソッド、int.Parse()、int.TryParse()、および Convert.ToInt32()メソッドがあります。
このページの内容
C# のコンソールから整数を読み取るには、まず Console.ReadLine() で1行を読み取り、その文字列を変換します。入力が想定外の文字列になる可能性がある場合は int.TryParse() を使いましょう。変換できたかどうかを返すため、通常の制御フローで不正な入力に対処できます。このガイドでは、行単位の入力に使う int.Parse()、int.TryParse()、Convert.ToInt32() を比較します。
int.Parse() でコンソールから整数を読み取る
int.Parse() は、有効な 32 ビット整数を含む文字列を int に変換します。入力が信頼できる場合や、周囲のコードで変換エラーを処理する場合に、簡潔に書けます。
次の完全なプログラムは、1行を読み取って変換した値を表示します。
using System;
using System.IO;
class Program
{
static void Main()
{
Console.SetIn(new StringReader("42"));
Console.Write("Enter an integer: ");
string input = Console.ReadLine();
int value = int.Parse(input);
Console.WriteLine($"You entered: {value}");
}
}
Enter an integer: You entered: 42
整数ではない文字列を渡すと FormatException が発生し、Int32 の範囲外の値を渡すと OverflowException が発生します。実際のコンソールでは、入力ストリームが1行を読み取る前に終了すると、Console.ReadLine() は null を返します。その値を int.Parse() に渡すと ArgumentNullException が発生するため、入力の終端に達する可能性がある場合は、先に null を確認してください。この例では StringReader から 42 を渡し、単独で使える形にしています。
int.TryParse() でコンソールから整数を読み取る
対話形式の入力では、変換の成否を通常の制御フローで扱えるため、int.TryParse() が最も分かりやすい選択肢になることが多いです。文字列が範囲内の整数を表す場合は true を返し、変換後の数値を out 変数に設定します。それ以外の場合は false を返し、その変数には既定値の 0 を設定します。数値を使う前に、戻り値の Boolean を確認してください。
using System;
using System.IO;
class Program
{
static void Main()
{
Console.SetIn(new StringReader("42"));
Console.Write("Enter an integer: ");
string input = Console.ReadLine();
int value;
if (int.TryParse(input, out value))
{
Console.WriteLine($"You entered: {value}");
}
else
{
Console.WriteLine("Enter a whole number within the Int32 range.");
}
}
}
Enter an integer: You entered: 42
数値以外の文字列、入力の終端、または int の範囲外の値に対して、TryParse は false を返すため、プログラムは else ブランチのメッセージを表示します。プロンプトと解析の確認をループに入れれば、入力し直せるようにできます。この例では1回だけ応答して終了します。ここでは例を単独で使えるように、StringReader から 42 を渡します。
Convert.ToInt32() でコンソールから整数を読み取る
Convert.ToInt32() も、Console.ReadLine() が返す行を変換する方法です。数値を表す文字列なら、int.Parse() と同じ int 値になります。ただし、任意の文字列を安全に変換できるわけではありません。数値以外の文字列では FormatException が発生することがあり、Int32 の範囲外の値では OverflowException が発生することがあります。null 文字列は例外で、Convert.ToInt32((string)null) は 0 を返しますが、int.Parse(null) は ArgumentNullException をスローします。
using System;
using System.IO;
class Program
{
static void Main()
{
Console.SetIn(new StringReader("42"));
Console.Write("Enter an integer: ");
string input = Console.ReadLine();
int value = Convert.ToInt32(input);
Console.WriteLine($"You entered: {value}");
}
}
Enter an integer: You entered: 42
入力を人が行い、通常の検証処理で対処したい場合は int.TryParse() を選びましょう。変換エラーを呼び出し元で処理する場合は、int.Parse() または Convert.ToInt32() を使えます。ここで紹介したコンソール入力の例では、3つの方法すべてで最初に Console.ReadLine() を使います。違いは、変換結果や特殊な入力値をどう扱うかです。