-3

私はC#でATMを作っています。その機能の 1 つは、ユーザーが自分のアカウント間で送金できるようにすることです。ユーザーが転送に無効な金額 (マイナスの金額など) を入力した場合、有効になるまで再度金額を入力するように求めるメッセージがユーザーに表示されるようにするにはどうすればよいですか? while ループを使用してみましたが、負の値の行を入力するとすぐに、「転送する有効な金額を入力してください」というメッセージがノンストップで繰り返されました。

Console.WriteLine("How much would you like to transfer?");
                double transferamt = double.Parse(Console.ReadLine());
                if (transferamt < 0)
                {
                    Console.WriteLine("Please enter a valid amount to transfer");

                }              
4

4 に答える 4

10

を使用し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;
}
于 2013-09-07T09:18:52.760 に答える
1

while ループを使用する必要がありますが、再度読み取りを求めるプロンプトが表示されます。

while(transferamt < 0){
    Console.WriteLine("Please enter a valid amount to transfer");
    transferamt = double.Parse(Console.ReadLine());
}
于 2013-09-07T09:17:56.860 に答える
1

ifこれは1 回限りの条件を使用しています。条件が正しくなるまで繰り返し続けたい場合は、ループを使用する必要がありますwhile

double transferamt = -1;
while (transferamt < 0)
{
    Console.WriteLine("Please enter a valid amount to transfer");
    transferamt = double.Parse(Console.ReadLine());
}  
于 2013-09-07T09:18:13.900 に答える