我有以下几点:

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实现是否更宽松,允许采用指数/科学表示法。)也必须涵盖这些内容)

10-07 19:40
查看更多