我想将小数安全地转换为整数。C#将小数转换为int安全
喜欢的东西
public static bool Decimal.TryConvertToInt32(decimal val, out int val)
这将返回false,如果它不能转换为整数,如果它可以真正瓦特/输出成功。
这是为了避免捕获decimal.ToInt32方法中的OverflowException。什么是最简单的方法来做到这一点?
我想将小数安全地转换为整数。C#将小数转换为int安全
喜欢的东西
public static bool Decimal.TryConvertToInt32(decimal val, out int val)
这将返回false,如果它不能转换为整数,如果它可以真正瓦特/输出成功。
这是为了避免捕获decimal.ToInt32方法中的OverflowException。什么是最简单的方法来做到这一点?
这里:
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;
}
请注意,您仍然需要在'false'路径中指定'intval'。 –
@AnthonyPegram - 谢谢。 – Oded
比较转换前的小数点与int.MinValue
和int.MaxValue
。
我会写类小数像这样的扩展方法:
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());
}
这有什么错使用Int32.TryParse(字符串)?
我不会将十进制转换为字符串,然后返回一个整数。这会花费很多性能,并且不会直接处理非整数小数。 – Superman
当然会。如果你做Int32.TryParse(“3.14”,d),你会得到一个False结果。 –
你为什么试图避免赶上OverflowException
?这是有原因的,你应该完全抓住它,你叫。例外在整个框架中广泛使用,用户应该抓住它们。 Try方法可以帮助你使代码更加紧凑和清晰,但是如果框架没有合适的方法(在这种情况下为Decimal.TryConvertToInt32()
),捕获OverflowException
是合适的。实际上,比创建扩展类或编写自己的单独静态方法(包括在框架已经为您提供此功能的情况下编写自己的代码)更清楚。
你是否建议你应该*总是*捕捉异常,你应该*从不*试图避免它们?如果是这样,那是不好的建议。在可能的情况下绝对避免它们(例如,通过验证它们的已知原因),并且只有在有实际处理它们的方法时才抓住它们。例外是昂贵的,它们不应该用于控制流程。 –
你是对的,我很欣赏评论。开发人员要确定这是否会发生很少或频繁发生。根据我的经验,用于转换Decimal.ToInt32的类似OverflowException的事情很少会发生,并且异常处理程序可以很好地适当地设置结果。但是它取决于场景,并且我非常感谢您添加关于异常性能的重要注意事项。 – mattypiper
投掷和捕捉异常很昂贵。设置一个try/catch块不是,并且如果导致异常的条件永远不会发生,它可能比进行验证[验证将在转换本身中重复]更便宜, – Random832
只有2种情况下抛出了OverflowException,即x int.MaxValue不能只用'if'吗? –
harold
如果给出了0.5,你希望它做什么? –
是否要舍入或舍去小数? – AllenG