そして、Java の観点からは、次のような方法で取得できるにもかかわらず、そのような同様のメソッドが欠落していることを指摘するだけです。
boolean isInteger = Pattern.matches("^\d*$", myString);
Integer.parseInt(myString)
例外がスローされるかどうかを予測するには、さらに作業が必要です。文字列は . で始まる場合があり-
ます。また、int の有効桁数は 10 桁を超えることはできません。したがって、より信頼できる表現は^-?0*\d{1,10}$
. しかし、この式でもすべての Exception を予測することはできません。これはまだ不正確すぎるためです。
信頼できる正規表現を生成することが可能です。しかし、それは非常に長いでしょう。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;
}