从 Java 的角度来看,只是指出它缺少这样一个类似的方法,尽管我们可以通过以下方式获得它:
boolean isInteger = Pattern.matches("^\d*$", myString);
要预测是否Integer.parseInt(myString)
会抛出异常,还有更多工作要做。字符串可以以-
. 此外,一个 int 的有效数字不能超过 10 个。所以更可靠的表达式是^-?0*\d{1,10}$
. 但是即使这个表达式也不能预测每个异常,因为它仍然太不精确。
生成可靠的正则表达式是可能的。但这会很长。也可以实现一个精确确定 parseInt 是否会抛出异常的方法。它可能看起来像这样:
static boolean wouldParseIntThrowException(String s) {
if (s == null || s.length() == 0) {
return true;
}
char[] max = Integer.toString(Integer.MAX_VALUE).toCharArray();
int i = 0, j = 0, len = s.length();
boolean maybeOutOfBounds = true;
if (s.charAt(0) == '-') {
if (len == 1) {
return true; // s == "-"
}
i = 1;
max[max.length - 1]++; // 2147483647 -> 2147483648
}
while (i < len && s.charAt(i) == '0') {
i++;
}
if (max.length < len - i) {
return true; // too long / out of bounds
} else if (len - i < max.length) {
maybeOutOfBounds = false;
}
while (i < len) {
char digit = s.charAt(i++);
if (digit < '0' || '9' < digit) {
return true;
} else if (maybeOutOfBounds) {
char maxdigit = max[j++];
if (maxdigit < digit) {
return true; // out of bounds
} else if (digit < maxdigit) {
maybeOutOfBounds = false;
}
}
}
return false;
}
我不知道哪个版本更有效。这主要取决于上下文哪种检查是合理的。
在 C# 中要检查是否可以转换字符串,您将使用 TryParse。如果它返回 true,那么它作为副产品同时被转换。这是一个简洁的功能,我认为仅重新实现 parseInt 以返回 null 而不是抛出异常没有问题。
但是,如果您不想重新实现解析方法,那么手头有一组可以根据情况使用的方法仍然会很好。它们可能看起来像这样:
private static Pattern QUITE_ACCURATE_INT_PATTERN = Pattern.compile("^-?0*\\d{1,10}$");
static Integer tryParseIntegerWhichProbablyResultsInOverflow(String s) {
Integer result = null;
if (!wouldParseIntThrowException(s)) {
try {
result = Integer.parseInt(s);
} catch (NumberFormatException ignored) {
// never happens
}
}
return result;
}
static Integer tryParseIntegerWhichIsMostLikelyNotEvenNumeric(String s) {
Integer result = null;
if (s != null && s.length() > 0 && QUITE_ACCURATE_INT_PATTERN.matcher(s).find()) {
try {
result = Integer.parseInt(s);
} catch (NumberFormatException ignored) {
// only happens if the number is too big
}
}
return result;
}
static Integer tryParseInteger(String s) {
Integer result = null;
if (s != null && s.length() > 0) {
try {
result = Integer.parseInt(s);
} catch (NumberFormatException ignored) {
}
}
return result;
}
static Integer tryParseIntegerWithoutAnyChecks(String s) {
try {
return Integer.parseInt(s);
} catch (NumberFormatException ignored) {
}
return null;
}