を使用しdouble.TryParse
ます。これにより、ユーザーが無効な形式を入力した場合に例外がスローされなくなります。解析の成功に基づいて、これをループでラップします。
bool valid = false;
double amount;
while (!valid)
{
Console.WriteLine("How much would you like to transfer?");
valid = double.TryParse(Console.ReadLine(), out amount);
}
負の値の追加の検証を追加する必要があります。
bool valid = false;
double amount;
while (!valid)
{
Console.WriteLine("How much would you like to transfer?");
valid = double.TryParse(Console.ReadLine(), out amount)
&& amount > 0;
}
C# は、出力を決定するために必要な式の部分のみを処理します。したがって、上記の例では、double.TryParse(...)
false を返す場合はamount > 0
評価されませんfalse && anything == false
。
double.Parse
値が有効な double でない場合、例外がスローされます。.NET のバージョンで使用できない場合double.TryParse
は、次のように独自に記述できます。
public bool TryParse(string value, out double output)
{
output = 0;
try
{
double = double.Parse(value);
}
catch (Exception ex)
{
return false;
}
}
次の試行で別のメッセージが必要な場合は、次のように少し書き直すことができます。
double amount;
Console.WriteLine("How much would you like to transfer?");
bool valid = double.TryParse(Console.ReadLine(), out amount)
&& amount > 0;
while (!valid)
{
Console.WriteLine("Please enter a valid amount to transfer?");
valid = double.TryParse(Console.ReadLine(), out amount)
&& amount > 0;
}
これは次のようにリファクタリングできます。
void Main()
{
double amount = GetAmount();
}
double GetAmount()
{
double amount = 0;
bool valid = TryGetAmount("How much would you like to transfer?", out amount);
while (!valid)
{
valid = TryGetAmount("Please enter a valid amount to transfer?", out amount);
}
return amount;
}
bool TryGetAmount(string message, out double amount)
{
Console.WriteLine(message);
return double.TryParse(Console.ReadLine(), out amount)
&& amount > 0;
}