2011-08-08 18 views
0

私は、指定された文字列が有効な整数かどうかを判断しようとする次のコードを持っています。それが整数でInt32の有効範囲内にない場合は、Int32.MaxValueより大きいかInt32.MinValueより小さいかを具体的に知る必要があります。文字列を整数に変換し、それがInt32.MinValueより小さいかInt32.MaxValueより大きいかどうかを判断する方法?

try 
{ 
    return System.Convert.ToInt32(input); 
} 
catch (OverflowException) 
{ 
    return null; 
} 
catch (FormatException) 
{ 
    return null; 
} 

それが許容値の範囲内にない場合Convert.ToInt32は、OverflowExceptionがスローされますが、それはより大きく、より少ないの両方に同じ例外がスローされます。例外のテキストを解析することとは別のものを判断する方法はありますか?

+1

本当に良い修正はありませんが、Int64に変換して比較しますか? – Manatherin

+1

intではなくlongに変換しますか? – dtb

+0

@dtb:値が長すぎると同じ問題が発生しました... –

答えて

9

は、.NET 4を使用しているとして、あなたはBigIntegerを使用することができます - それに解析し、その後、int.MaxValueint.MinValueBigInteger表現して結果を比較します。

ただし、例外をキャッチしてフロー制御に使用する代わりにTryParseを使用することを強くおすすめします。

+0

私はそれについて考えましたが、同じ問題を残していませんか? TryParseを使用している場合、数値が範囲外の場合は出力が0になるので、それが大きいか小さいかを判断するのと同じ問題があるようです。 –

+0

@The Matt:BigIntegerはどのように範囲外になりますか?これは、BigInteger.TryParseがfalseを返すと、入力が根本的に無効であることを知っています。それ以外の場合は、出力を '(BigInteger)int.MaxValue'と'(BigInteger)int.MinValue'と比較して範囲を確認してください。 –

+0

申し訳ありませんが、誤解されています。あなたは、これらの両方の提案を組み合わせて使用​​することを意味しました。とった。 –

2

代わりにInt64(つまりlong)に変換してから比較を行うことができます。これにより、制御フローの状況として例外も排除されます。

0

考え方は次のとおりです。

bool isWrong = false; 
bool isLarge = false; 
if (!Int32.TryParse(rawValue, out int32Holder)) 
{ 
     if (!Int64.TryParse(rawValue, out int64Holder)) 
     { 
      isWrong = true; 
     } 
     else 
     { 
      isLarge = true; 
     } 
} 
1

OverflowExceptionが投げた(あるいはあなたがTryParseを使用する場合はfalseを与えた)の入力がInt32.MaxValueをよりかのInt32未満であるかどうかを知るための非常に簡単な方法があります.MinValue:Int32.MinValueより小さい数値は負の値になります。そのため、文字列表現は ' - 'で始まります。

関連する問題