如何检查一个数字超出Integer类型的范围?

时间:2018-05-29 15:48:08

标签: java

如何检查数字是否超出整数范围?

如果该数字大于Integer.MAX_VALUE,请返回Integer.MAX_VAlUE

如果该数字小于Integer.MIN_VALUE,请返回Integer.MIN_VAlUE

EX: 2000000000000 - > Integer.MAX_VALUE

这是我的解决方案,但效率似乎非常低。

if(str.length() >= 10) {
    if(str.charAt(0) != '-') {
        return Integer.MAX_VALUE;
    } else if(str.length() >= 11 && str.charAt(0) == '-') {
        return Integer.MIN_VALUE;
    }
}

4 个答案:

答案 0 :(得分:1)

先将它解析为long,然后检查它是否在整数max和min。

的范围内
long value = Long.parseLong(inputString);
if (value < Integer.MAX_VALUE && value > Integer.MIN_VALUE) 
     doWhatYouWantToDo();

答案 1 :(得分:0)

您可以尝试以下代码:

</body>

DEMO

答案 2 :(得分:0)

可以尝试直接解析为int,如果不在Integer范围内,会抛出NumberFormatException

String number = "78654567788";
try {
    Integer.parseInt(number);
    System.out.println("Within the range");
} catch (NumberFormatException e) {
    System.out.println("out of range");
}

答案 3 :(得分:0)

速度方面,您的代码可能没问题。更大的问题是它是不正确的,因为并不是所有长度至少为 10 的字符串都代表超出范围的字符串,即使假设它们只包含 0-9-

要正确执行此操作,您需要将字符串与限制的字符串表示形式进行比较:

// Some constants.
static final String MAX_VALUE_STRING = Integer.toString(Integer.MAX_VALUE);
static final String MIN_VALUE_STRING = Integer.toString(Integer.MIN_VALUE);

static int parseClamped(String str) {
  // Assuming str.matches("-?[0-9]+") is true.

  if (str.startsWith("-")) {
    // Negative numbers longer than MIN_VALUE.
    // Obviously less than MIN_VALUE.
    if (str.length() > MIN_VALUE_STRING.length()) {
      return Integer.MIN_VALUE;
    }

    // Negative numbers of the same length as MIN_VALUE.
    // Less than MIN_VALUE if it is lexicographically greater.
    if (str.length() == MIN_VALUE_STRING.length() && str.compareTo(MIN_VALUE_STRING) > 0) {
      return Integer.MIN_VALUE;
    }
  } else {
    // Positive numbers longer than MAX_VALUE.
    // Obviously greater than MAX_VALUE.
    if (str.length() > MAX_VALUE_STRING.length()) {
      return Integer.MAX_VALUE;
    }

    // Positive numbers of the same length as MIN_VALUE.
    // Greater than MAX_VALUE if it is lexicographically greater.
    if (str.length() == MAX_VALUE_STRING.length() && str.compareTo(MAX_VALUE_STRING) > 0) {
      return Integer.MAX_VALUE;
    }
  }

  return Integer.parseInt(str);
}

您可以使用辅助方法更简洁地编写此代码:

static boolean longerThanOrAfter(String str, String c) {
  return str.length() > c.length() || str.compareTo(c) > 0;
}

static int parseClamped(String str) {
  // Assuming str.matches("-?[0-9]+") is true.

  if (str.startsWith("-")) {
    if (longerThanOrAfter(str, MIN_VALUE_STRING)) {
      return Integer.MIN_VALUE;
    }
  } else {
    if (longerThanOrAfter(str, MAX_VALUE_STRING)) {
      return Integer.MAX_VALUE;
    }
  }
  return Integer.parseInt(str);
}

这是有效的,因为它不分配任何新对象(至少,不在 String.compareTo 方法之外)。

但这是以缺乏对字符串的验证为代价的。如果您不能保证您的输入是数字,则可以使用预编译的正则表达式进行检查。这在性能方面不会很糟糕,但更多的工作仍然比不工作要慢。

当然,Integer.parseInt 允许正值以 + 开头,因此您可能需要考虑处理它。这可以通过与值为 "+" + MAX_VALUE_STRING 的常量进行比较来以相同的模式完成。