Visual Basicでは、データはしばしばユーザーによって文字列として入力されます(例えば、TextBoxやInputBox経由で),しかし、その後の処理には数値型に変換する必要があります。VBの初期バージョンでは、ValまたはCIntを使用した緩やかな変換が行われており、それが不正確なデータによる明示的および暗示的なエラーを引き起こすことがありました。文字列は常に正しい値を含むものと想定されていましたが、実際にはユーザーが無効な文字を入力するため、エラーや不正確な変換が発生します。
問題は、変換が保護されておらず、アプリケーションのクラッシュや不正確な計算を引き起こす可能性があることです。例えば、Val("1a")は1を返し、これは予期しない結果となります。TryParseを使用し、入力フォーマットを厳密にチェックすることで、これらのエラーを回避し、入力を正しく処理できます。
解決策は、Integer.TryParse(またはDouble.TryParseなど)メソッドを使用することで、成功した場合にのみTrueを返します。
コード例:
Dim input As String = TextBox1.Text Dim value As Integer If Integer.TryParse(input, value) Then ' 正しい数値が入力されました,変数valueに値が格納されています Else MessageBox.Show("整数を入力してください") End If
主な特徴:
ユーザー入力処理におけるVal関数の危険性は何ですか?
Valは最初の無効な文字の前までの数値を返し、エラーをスローしないため、不正確なロジックにつながる可能性があります。
Dim n = Val("12abc") ' 12を返しますが、文字列は無効です
CIntとInteger.Parseの違いは何ですか?
CIntは銀行家の丸めを行い、Integer.Parseは文字列と数値が正確に一致することを要求し、エラー時に例外をスローします。
なぜTryParseは常に"1,234"の文字列に対してTrueを返さないのですか?
結果はWindowsの地域設定に依存します:どこでは小数点の区切りがカンマであり、どこではピリオドです。フォーマットを明示的に指定することが重要です:
Dim number As Double Double.TryParse("1,234", NumberStyles.Any, CultureInfo.InvariantCulture, number)
金融モジュールがInputBoxからデータを受け取り、Valを使用して変換し、10.5の合計が一部のケースで10になってしまう(カンマが認識されず、ピリオドが入力されなかった)。
利点:
欠点:
文化的設定と入力フィールドの検証を考慮したTryParseへの移行。
利点:
欠点: