0

販売変数の値を割り当てようとする行のそれぞれのケースで、FormatException を取得し続けます。私が間違っていることを知っている人はいますか?ループについて学ぶために、このコンソール プログラムを宿題にすることになっていますが、他のことについてもっと調べています。各販売の 10% の手数料に基づいて、営業担当者の手数料の実行中のタブを保持することになっています。とにかく、ここにコードがあります:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TubSales
{
   class Program
   {
      static void Main(string[] args)
      {
         char initial;
         const double COMM_INT = 0.10;
         double sale, aComm = 0, bComm = 0, eComm = 0;
         Console.Write("Enter 'A' for Andrea, 'B' for Brittany,\n'E' for Eric, or 'Z' to quit >> ");
         initial = Convert.ToChar(Console.Read());
         while (initial != 'z' && initial != 'Z')
         {
            switch (initial)
            {
               case 'a':
               case 'A':
                  Console.Write("Enter the sales for Andrea >> ");
                  sale = Convert.ToDouble(Console.ReadLine());
                  aComm = aComm + COMM_INT * sale;
                  break;
               case 'b':
               case 'B':
                  Console.Write("Enter the sales for Brittany >> ");
                  sale = Convert.ToDouble(Console.ReadLine());
                  bComm = bComm + COMM_INT * sale;
                  break;
               case 'e':
               case 'E':
                  Console.Write("Enter the sales for Eric >> ");
                  sale = Convert.ToDouble(Console.ReadLine());
                  eComm = eComm + COMM_INT * sale;
                  break;
               default:
                  Console.WriteLine("You did not enter a valid initial");
                  break;
            }
            Console.Write("Enter 'A' for Andrea, 'B' for Brittany, or 'E' for Eric >> ");
            initial = (char)Console.Read();
         }
         Console.WriteLine("Andrea had {0}, Brittany had {1}, and Eric had {2} in commissions.", aComm.ToString("C"), bComm.ToString("C"), eComm.ToString("C"));
         Console.Write("Press any key to exit... ");
         Console.ReadKey();
      }
   }
}
4

3 に答える 3

5

sale変数に値を割り当てようとする行の各ケースで、FormatExceptionが発生し続けます。誰かが私が間違っていることを知っていますか?

Convert.ToDoubleメソッドは、文字列(から返される)が有効な数値でない場合にを発生させFormatExceptionますConsole.ReadLine()

通常、ユーザー入力を解析する場合は、代わりにDouble.TryParseを使用することをお勧めします。これにより、例外をキャッチせずに入力が有効な数値であるかどうかを判断できます。

これは通常、次のようになります。

Console.Write("Enter the sales for Andrea >> ");
while (!double.TryParse(Console.ReadLine(), out sale))
{
    Console.WriteLine("Value entered was not a valid number.");
    Console.Write("Enter the sales for Andrea >> ");
}
// Once you get here, "sale" will be set appropriately
于 2012-05-14T18:10:04.883 に答える
1

Reed の回答は素晴らしいものですが、ここでは問題ではありません。

実際に起こるのはこれと同じ状況です

Console.Read は「キャリッジ リターンの 2 番目の部分」のみを読み取り、「」を返します。これが Convert が失敗する理由です。

交換

initial = Convert.ToChar(Console.Read());

initial = Convert.ToChar(Console.ReadLine());
于 2012-05-14T18:23:05.277 に答える
0

交換

initial = Convert.ToChar(Console.Read());

initial = Convert.ToChar(Console.ReadLine().FirstOrDefault());
于 2012-05-14T18:22:13.390 に答える