而且從爪哇點, 只是指出,它缺少這樣的 類似的方法,儘管我們可以得到 它貫穿東西,如:
boolean isInteger = Pattern.matches("^\d*$", myString);
預測是否Integer.parseInt(myString)
會拋出一個Exception有更多的工作要做。該字符串可以以-
開頭。另外一個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;
}
BTW,有將是獲得在Java的替代方式。一個是使用Integer而不是int,另一個是將int放入一個數組並將其傳遞給該方法。 – 2009-05-29 07:31:51
是的,這就是爲什麼我提到「想要返回原始」部分。這是可能的,但從來沒有整齊,基本上。 – Calum 2009-06-03 16:17:56