2011-11-30 6 views
9

10進数を整数に安全に変換しようとしています。安全に10進数をintに変換する

public static bool Decimal.TryConvertToInt32(decimal val, out int val) 
よう

何か

それができるならば、それは成功した出力/ wの整数に変換し、真のことができない場合は、これはfalseを返します。

これは、decimal.ToInt32メソッドでOverflowExceptionをキャッチしないようにするためです。これを行う最も簡単な方法は何ですか?

+1

OverflowExceptionがスローされる2つのケースがあります。つまり、x int.MaxValueは単に 'if'を使用できませんか? – harold

+2

与えられた、例えば0.5の場合、何をしたいですか? –

+1

小数点以下を切り捨てたいのですか? – AllenG

答えて

9

public static bool TryConvertToInt32(decimal val, out int intval) 
{ 
    if (val > int.MaxValue || val < int.MinValue) 
    { 
     intval = 0; // assignment required for out parameter 
     return false; 
    } 

    intval = Decimal.ToInt32(val); 

    return true; 
} 
+1

'false'パスで' intval'に割り当てる必要があることに注意してください。 –

+0

@AnthonyPegram - ありがとう。 – Oded

2

変換前にint.MinValueint.MaxValueの小数を比較してください。ここで

3

私はこのようなクラスの小数のための拡張メソッドを記述します。

public static class Extensions 
{ 
    public static bool TryConvertToInt32(this decimal decimalValue, out int intValue) 
    { 
     intValue = 0; 
     if ((decimalValue >= int.MinValue) && (decimalValue <= int.MaxValue)) 
     { 
      intValue = Convert.ToInt32(decimalValue); 
      return true; 
     } 
     return false; 
    } 
} 

あなたはそのようにそれを使用することができます:

if (decimalNumber.TryConvertToInt32(out intValue)) 
{ 
    Debug.WriteLine(intValue.ToString()); 
} 
0

と間違って何Int32.TryParse(string)を使用していますか?

+0

私は10進数を文字列に変換してから、整数に戻すのは興味深いことではありません。これは多くのパフォーマンスを必要とし、非整数小数を直接処理することはありません。 – Superman

+0

それはもちろんです。 Int32.TryParse( "3.14"、d)を実行すると、Falseの結果が得られます。 –

0

OverflowExceptionをキャッチしないようにしようとしているのはなぜですか?それは理由のためにそこにあり、あなたはと呼ぶ場所にそれを完全に捕らえるべきです。例外はフレームワーク全体で広く使用され、ユーザーはそれらを捕捉する必要があります。 Tryメソッドは、コードをよりきれいにしてきれいにするのに役立ちますが、フレームワークに適切なメソッド(この場合はDecimal.TryConvertToInt32())がない場合は、OverflowExceptionをキャッチするのが適切です。実際には、拡張クラスを作成するか、独自の別個の静的メソッドを作成するよりもはっきりしています(両方とも、フレームワークがすでにこの機能を提供している独自のコードを記述することを含みます)。

+1

*常に*例外をキャッチすべきであることをあなたは示唆していますか?もしそうなら、それは悪いアドバイスです。可能なときには絶対に避けてください(たとえば、既知の原因に照らして検証するなど)、実際に対処する手段がある場合にのみそれをキャッチします。例外は高価であり、制御フローに使用すべきではありません。 –

+0

あなたは正しいと私はコメントを感謝します。これがまれに起こるかどうか決めるのは開発者次第です。私の経験では、Decimal.ToInt32を変換するためのOverflowExceptionのようなものはまれにしか発生せず、例外ハンドラは結果を適切に設定するためにうまく動作します。しかし、それはシナリオに依存します。また、例外パフォーマンスについてのこの重要な注釈を追加することに本当に感謝しています。 – mattypiper

+0

例外をスローしてキャッチするのは高価です。try/catchブロックを設定することはできません。例外が_ほとんど発生しない_が発生する条件が発生した場合、検証を行うよりも平均的に安くなる可能性があります[変換自体で繰り返される検証] – Random832

関連する問題