如何检查数字是否超出整数范围?
如果该数字大于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;
}
}
答案 0 :(得分:1)
先将它解析为long,然后检查它是否在整数max和min。
的范围内long value = Long.parseLong(inputString);
if (value < Integer.MAX_VALUE && value > Integer.MIN_VALUE)
doWhatYouWantToDo();
答案 1 :(得分:0)
答案 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
的常量进行比较来以相同的模式完成。