我有一个双重值,我想将其转换为Int32。如果可以转换,我如何在转换前检查?
有时值未定义,转换为Int32会抛出OverflowException。
我已经尝试过那样测试了:
double value = getSomeValue();
if (value == Double.NAN) {
value =0;
}
int v = Convert.ToInt32(value);
但这并未涵盖所有情况。
答案 0 :(得分:9)
也许这个?
更新:我相信以下更新解决了边缘情况。我已经针对每种情况测试了这一点,我可以考虑根据直接尝试Convert.ToInt32
并捕获异常的方法来验证输出。
static bool TryConvertToInt32(double value, out int result)
{
const double Min = int.MinValue - 0.5;
const double Max = int.MaxValue + 0.5;
// Notes:
// 1. double.IsNaN is needed for exclusion purposes because NaN compares
// false for <, >=, etc. for every value (including itself).
// 2. value < Min is correct because -2147483648.5 rounds to int.MinValue.
// 3. value >= Max is correct because 2147483648.5 rounds to int.MaxValue + 1.
if (double.IsNaN(value) || value < Min || value >= Max)
{
result = 0;
return false;
}
result = Convert.ToInt32(value);
return true;
}
答案 1 :(得分:3)
检查Double.IsNaN是否确定它在int.MinValue和int.MaxValue之间,
答案 2 :(得分:3)
您可以与Int32的范围进行比较。
if(value <= (double)Int32.MAX_VALUE && value >= (double)Int32.MIN_VALUE)
return (Int32)value;
return 0;
当然,如果你想在double太大时返回Max / Min值,你可以这样做:
if(value <= (double)Int32.MAX_VALUE && value >= (double)Int32.MIN_VALUE)
return (Int32)value;
if(value > (double)Int32.MAX_VALUE)
return Int32.MAX_VALUE;
if(value < (double)Int32.MIN_VALUE)
return Int32.MIN_VALUE;
return 0;
答案 3 :(得分:1)
尝试这样的事情:
double d = Double.NaN;
int i;
if(Int32.TryParse(d.ToString(), out i))
{
Console.WriteLine("Success");
Console.WriteLine(i);
} else {
Console.WriteLine("Fail");
}
答案 4 :(得分:0)
您可以尝试这样的事情:
(value>=Int32.MinValue)&&(value<=Int32.MaxValue)
这可能会错误地拒绝超出int
值范围的值,但会将其四舍五入。所以你可能想稍微扩大一下间隔。
例如,Int32.MaxValue+0.1
被拒绝。
你想如何对待非整数双打?此代码接受它们并静默地舍去小数部分。基于int.TryParse(value.ToString(),...)
的建议会认为这样的双打无效。
答案 5 :(得分:0)
除非你绝对需要性能,否则使用异常处理呢?