2017-10-23 9 views
0

こんにちは、これは本当に今のvbで数回問題を抱えていて、なぜ私は理解していません。このコード文字列 "" ""から無効なキャスト例外

Module Module1 

    Sub Main() 
     While True 
      Console.Title = "discount orders" 
      Console.Clear() 
      Console.WriteLine("please enter the value of the order {0}£", vbNewLine) 
      Dim order As Double = CDbl(Console.ReadLine()) 
      Select Case order 
       Case 0 To 1000 
        order = order 
       Case 1000 To 2500 
        order = order * 0.95 
       Case 2500 To 5000 
        order = order * 0.9 
       Case 5000 To 10000 
        order = order * 0.85 
       Case > 10000 
        order = order * 0.8 

      End Select 
      Console.WriteLine("the discounted price is £{0}", order) 
      Console.Read() 
     End While 
    End Sub 

End Module 

それはループが、それはなぜそれが起こっている

+0

Console.Read()行とConsole.Clear()を削除できますか? – Youssef13

答えて

1

倍増すると、文字列から変換するカントので、それがライン8に壊し二度目に実行されたが、初めての作品に?

Console.Read() 
... 
Console.Clear() 

単一の文字が読み取られた後、コンソールはクリアされます。したがって、ユーザがを入力すると、が入力され、キャリッジリターンと改行がコンソールに入力され、キャリッジリターン(char 13)だけが読み取られ、コンソールがクリアされます。改行(char 10)はまだそこにあり、次の入力に使用されます。 Console.Read()の代わりに、両方の文字を使用する場合はConsole.ReadLine()を使用します。

また、数値以外の値を入力したときにアプリケーションがクラッシュしないように、いくつかの検証を追加します。

Sub Main() 
    Console.Title = "discount orders" 
    While True 
     Console.Clear() 
     ' Console.Write so the £ is before the input 
     Console.Write("please enter the value of the order {0}£", Environment.NewLine) 
     ' this is the user's input 
     Dim input = Console.ReadLine() 
     Dim order As Double 
     ' try to parse a number, if not this is false 
     If Double.TryParse(input, order) Then 
      Select Case order 
       Case 0 To 1000 
        order = order 
       Case 1000 To 2500 
        order = order * 0.95 
       Case 2500 To 5000 
        order = order * 0.9 
       Case 5000 To 10000 
        order = order * 0.85 
       Case > 10000 
        order = order * 0.8 
      End Select 
      Console.WriteLine("the discounted price is £{0}", order) 
     Else 
      Console.WriteLine("'{0}' not a valid input. try again", input) 
     End If 
     ' ReadLine to consume both the carriage return and line feed 
     Console.ReadLine() 
    End While 
End Sub 

有効なエントリ:

ため
の値を入力してください£2345
割引価格£2227.75

無効なエントリです:

注文の値を入力してください
£322k
'322k'は有効な入力ではありません。もう一度お試しください

+1

これは動作することに同意しますが、Try/Catchは必要ありません。 'TryParse'は入力が無効であれば' False'を返します。 – Blackwood

+0

@Blackwood right – djv

+0

@djv - しかしOPのコードはなぜ失敗していますか? – Enigmativity

0

次の手順に進む前に入力を検証することをお勧めします。 "\r\n" - -

Sub Main() 
    While True 
     Console.Title = "discount orders" 
     Console.Clear() 
     Console.WriteLine("please enter the value of the order {0}£", vbNewLine) 
     Try 
      Dim input As UInteger 
      If UInteger.TryParse(Console.ReadLine, input) Then 
       Dim order As Double = Convert.ToDouble(input) 
       Select Case order 
        Case 0 To 1000 
         order = order 
        Case 1000 To 2500 
         order = order * 0.95 
        Case 2500 To 5000 
         order = order * 0.9 
        Case 5000 To 10000 
         order = order * 0.85 
        Case Is > 10000 
         order = order * 0.8 
       End Select 
       Console.WriteLine("the discounted price is £{0}", order) 
       Console.Read() 
      Else 
       Console.WriteLine("Please insert only numbers") 
       Console.Read() 
      End If 
     Catch ex As Exception 
      Console.WriteLine("Error!- {0}", ex.Message) 
      Console.Read() 
     End Try 
    End While 
End Sub 
0

あなたが持っている問題は、Console.Read()は、コンソールから次の文字を取得している、あなたはを入力ヒットした場合、その2つの文字だということですので、Readは1取得し、その後のReadLineはすぐに戻ります"\n"があなたの入力の最後であると考えているからです。その後、あなたはエラーを取得します。

代わりに.Read().ReadLine()にして、入力を押して続行するようユーザーに依頼してください。

関連する問題