2011-11-30 82 views
9

我想将小数安全地转换为整数。C#将小数转换为int安全

喜欢的东西

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

这将返回false,如果它不能转换为整数,如果它可以真正瓦特/输出成功。

这是为了避免捕获decimal.ToInt32方法中的OverflowException。什么是最简单的方法来做到这一点?

+1

只有2种情况下抛出了OverflowException,即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(字符串)?

+0

我不会将十进制转换为字符串,然后返回一个整数。这会花费很多性能,并且不会直接处理非整数小数。 – Superman

+0

当然会。如果你做Int32.TryParse(“3.14”,d),你会得到一个False结果。 –

0

你为什么试图避免赶上OverflowException?这是有原因的,你应该完全抓住它,你叫。例外在整个框架中广泛使用,用户应该抓住它们。 Try方法可以帮助你使代码更加紧凑和清晰,但是如果框架没有合适的方法(在这种情况下为Decimal.TryConvertToInt32()),捕获OverflowException是合适的。实际上,比创建扩展类或编写自己的单独静态方法(包括在框架已经为您提供此功能的情况下编写自己的代码)更清楚。

+1

你是否建议你应该*总是*捕捉异常,你应该*从不*试图避免它们?如果是这样,那是不好的建议。在可能的情况下绝对避免它们(例如,通过验证它们的已知原因),并且只有在有实际处理它们的方法时才抓住它们。例外是昂贵的,它们不应该用于控制流程。 –

+0

你是对的,我很欣赏评论。开发人员要确定这是否会发生很少或频繁发生。根据我的经验,用于转换Decimal.ToInt32的类似OverflowException的事情很少会发生,并且异常处理程序可以很好地适当地设置结果。但是它取决于场景,并且我非常感谢您添加关于异常性能的重要注意事项。 – mattypiper

+0

投掷和捕捉异常很昂贵。设置一个try/catch块不是,并且如果导致异常的条件永远不会发生,它可能比进行验证[验证将在转换本身中重复]更便宜, – Random832