我有以下几点:
string outOfRange = "2147483648"; // +1 over int.MaxValue
显然,如果您有数字以外的任何其他选择,则将失败:
var defaultValue = 0;
int.TryParse(outOfRange, out defaultValue);
我的问题是,由于这是一个数字,当您使用
int.TryParse()
时,它将失败,您怎么知道它失败了,因为该字符串超出了其存储容器的范围? 最佳答案
我将尝试解析,如果失败,则尝试解析更高容量的值。如果更高的容量值通过了解析,则表明它超出范围。如果同样失败,则表示输入错误。
string outOfRange = "2147483648"; // +1 over int.MaxValue
int result;
if (!Int32.TryParse(outOfRange, out result))
{
long rangeChecker;
if (Int64.TryParse(outOfRange, out rangeChecker))
//out of range
else
//bad format
}
不幸的是,我认为没有一种方法可以对任何类型进行通用处理。您必须为所有类型编写一个实现。因此,例如,对
Int64
做什么?也许使用BigInteger
代替:string outOfRange = "9223372036854775808"; // +1 over Int64.MaxValue
long result;
if (!Int64.TryParse(outOfRange, out result))
{
BigInteger rangeChecker;
if (BigInteger.TryParse(outOfRange, out rangeChecker))
//out of range
else
//bad format
}
编辑:自AFAIK以来,
double
浮点值可能会更有趣,没有“BigDecimal”,您可能还必须考虑在非常极端的情况下接近0的值(对此不确定)。可能您可以对BigInteger
检查进行一些修改,但是您可能还必须考虑小数点(在这里,最好是一个简单的正则表达式,使其仅包含数字,可选的负号,并且最多只能包含一个小数点)。如果有任何小数点,则必须将它们截断,然后简单地检查字符串的整数部分。EDITx2:这也是一个用于检查
double
值的难看的实现:// +bajillion over Double.MaxValue
string outOfRange = "90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.1";
double result;
if (!Double.TryParse(outOfRange, out result))
{
string bigIntegerInput = outOfRange;
if (!Regex.IsMatch(bigIntegerInput, @"^-?[0-9]\d*(\.\d+)?$"))
//bad format
int decimalIndex = bigIntegerInput.IndexOf('.');
if (decimalIndex > -1)
bigIntegerInput = bigIntegerInput.Substring(0, decimalIndex);
BigInteger rangeChecker;
if (BigInteger.TryParse(bigIntegerInput, out rangeChecker))
//out of range
else
//bad format
}
但老实说,在这一点上,我认为我们已经走出了深渊。除非您有一些实际的性能瓶颈,或者您的应用程序经常输入超出范围的值,否则最好捕获它们的时间是像this answer中那样的奇数时间,或者更简单地,将正则表达式应用于输入。在我的最后一个示例中,无论如何我都应该做完正则表达式后就退出了(但是我不知道
TryParse
实现是否更宽松,允许采用指数/科学表示法。)也必须涵盖这些内容)