验证字符串以查看它是否为整数?

时间:2013-09-07 20:05:55

标签: java

不热衷于使用parseInteger解决方案,它很丑陋,正如Joshua Bloch所说,你应该“仅在特殊条件下使用例外”。当然,我可以使用下面的代码块,但它不能保证它是一个整数。

for (char c : str.toCharArray())
{
    if (!Character.isDigit(c)) return false;
}
return true;

3 个答案:

答案 0 :(得分:1)

“仅针对特殊情况使用例外”是一种很好的做法,但这不是一个严格的规则。我认为这是使用例外优于备选方案的情况之一。

由于parseInteger()可以返回任何可能的int值,因此您不能使用任何其他返回值来指示失败。如果您知道自己永远不会处理特定值(例如-1-2147483648),则可以将其作为标记值返回以指示解析失败。

唯一的选择是返回表示成功或失败的boolean,并将解析后的值存储到参数中。但是,由于函数调用总是在Java中按值传递,因此您需要创建一个新类来执行此操作:

public class IntWrapper
{
    int value;
}
...

public static boolean myParseInt(String s, IntWrapper outValue)
{
    try
    {
        outValue.value = Integer.parseInt(s);
        return true;
    }
    catch(NumberFormatException e)
    {
        return false;
    }
}
...

IntWrapper value = new IntWrapper();
if (myParseInt(value))
{
    // Use value.value
}
else
{
    // Parsing failed
}

鉴于这些替代方案,我认为最简单的用法就是使用异常并适当地处理它们,即使非数字输入可能不一定是“例外”条件。

答案 1 :(得分:0)

我将异常保留,但如果您真的想要解决方案而无异常,您可以使用java内部类从this站点复制方法parseInt()并稍微更改一下

(你可以多修改一下,因为你不需要结果)

public static false isValidInt(String s, int radix)
                throws NumberFormatException
    {
        if (s == null) {
            return false;
        }

        if (radix < Character.MIN_RADIX) {
            return false;
        }

        if (radix > Character.MAX_RADIX) {
            return false;
        }

        int result = 0;
        boolean negative = false;
        int i = 0, len = s.length();
        int limit = -Integer.MAX_VALUE;
        int multmin;
        int digit;

        if (len > 0) {
            char firstChar = s.charAt(0);
            if (firstChar < '0') { // Possible leading "-"
                if (firstChar == '-') {
                    negative = true;
                    limit = Integer.MIN_VALUE;
                } else
                    return false;

                if (len == 1) // Cannot have lone "-"
                    return false;
                i++;
            }
            multmin = limit / radix;
            while (i < len) {
                // Accumulating negatively avoids surprises near MAX_VALUE
                digit = Character.digit(s.charAt(i++),radix);
                if (digit < 0) {
                    return false;
                }
                if (result < multmin) {
                    return false;
                }
                result *= radix;
                if (result < limit + digit) {
                    return false;
                }
                result -= digit;
            }
        } else {
            return false;
        }
        return true;
    }

答案 2 :(得分:0)

您可以使用:

public static boolean isInteger(String str) {
    if (str == null) {
        return false;
    }
    int length = str.length();
    if (length == 0) {
        return false;
    }
int i = 0;
if (str.charAt(0) == '-') {
    if (length == 1) {
        return false;
    }
    i = 1;
}
for (; i < length; i++) {
    char c = str.charAt(i);
    if (c <= '/' || c >= ':') {
        return false;
    }
}
return true;
}

这里已经回答:What's the best way to check to see if a String represents an integer in Java?