- 締切済み
Double→Integerへの変換で「意図しない変換を防ぐ」
'もう一質問。頻繁に考えていたこと Class himajin100000 Shared Sub Main Dim hoge As Integer Dim fuga As Double = 5.5 hoge = System.Convert.ToInt32(5.5) System.Diagnostics.Debug.Print(hoge.ToString) hoge = CType(5.5,Integer) System.Diagnostics.Debug.Print(hoge.ToString) 'という変換を防ぎたいです。 'Double値が5.0など、整数として切りの良い数字のときのみ変換したい 'それ以外はプログラマのミスとしてエラーが検出できるように。 'なお、 'hoge = DirectCast(5.5,Integer) 'とか 'hoge = DirectCast(System.Math.Floor(5.5),Integer) 'はエラーが出ます。 '今まで私は, hoge = Integer.Parse(System.Math.Floor(5.5).ToString) System.Diagnostics.Debug.Print(hoge.ToString) 'という風に書いてきました。 'Integer.Parse((5.5).ToString) System.FormatException '何かString型を介している地点で冗長な気がするので 'もっといい方法・わかりやすい方法等があれば教えてください End Sub End Class
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- kero_mio
- ベストアンサー率90% (94/104)
すいません、ダメですね。 (Integerは値型なので、TryCastはダメなのを忘れてました orz) 下記のようにInteger.TryParseをやってみてください。 (これなら、文字列で"5.5"と入っていても、例外は発生しません) この辺りは、私も2008 Beta2 + .NET Framework3.5 で私も試しました。 Public Class1 Sub Main() Dim hoge As Integer Dim age As Double = 5.5 Integer.TryParse(age.ToString(), hoge) Console.WriteLine(hoge) End Sub End Class また、間違った情報を教えてしまって、お手数をお掛け致しました ことをお詫び申し上げます。
- kero_mio
- ベストアンサー率90% (94/104)
VB.NETの2005を使っているんでしたら、TryCastが使えます。 If TryCast(System.Math.Floor(5.5),Integer) IsNot Nothing Then hoge = DirectCast(System.Math.Floor(5.5),Integer) End If とすれば、いいだけのような気がします。 2005じゃない場合は、考えないといけないですね。 その場合は、別途補足下さい。
補足
回答ありがとうございます。 しかし成功しません。(VB2008 Beta2,SharpDevelop 3 Alpha) Public Class NewClass Shared Sub Main() Dim hoge As Integer If TryCast(System.Math.Floor(5.5), Integer) IsNot Nothing Then hoge = DirectCast(System.Math.Floor(5.5), Integer) End If End Sub End Class コンパイルエラー ●'TryCast' must be reference type, but 'Integer' is a value type. ●Value of type 'Double' cannot be converted to 'Integer' が出ます