我试图安全地将小数转换为整数。
像
这样的东西public static bool Decimal.TryConvertToInt32(decimal val, out int val)
如果无法转换为整数,则返回false;如果可以,则返回true;
这是为了避免在decimal.ToInt32方法中捕获OverflowException。最简单的方法是什么?
答案 0 :(得分:10)
下面:
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 :(得分: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());
}
答案 2 :(得分:2)
在转化前将小数与int.MinValue
和int.MaxValue
进行比较。
答案 3 :(得分:0)
使用Int32.TryParse(string)有什么问题?
答案 4 :(得分:0)
为什么要避免捕获OverflowException
?这是有原因的,你应该完全抓住你拨打Decimal.ToInt32()
的地方。在整个框架中广泛使用例外,用户应该抓住它们。 Try方法可以帮助您解决这些问题,使代码更紧凑,更清晰,但是如果框架没有合适的方法(在这种情况下为Decimal.TryConvertToInt32()
),捕获OverflowException
是合适的事情。它实际上比制作扩展类或编写自己独立的静态方法更清晰(这两种方法都涉及在框架已经为您提供此功能的情况下编写自己的代码)。