В моем ограниченном опыте я работал над несколькими проектами, у которых был какой-то класс класса строк с методами, чтобы определить, является ли данная строка числом. Идея всегда была одинаковой, однако реализация была другой. Некоторые окружают попытку разбора с помощью try/catch
public boolean isInteger(String str) {
try {
Integer.parseInt(str);
return true;
} catch (NumberFormatException nfe) {}
return false;
}
и другие соответствуют регулярному выражению
public boolean isInteger(String str) {
return str.matches("^-?[0-9]+(\\.[0-9]+)?$");
}
Является ли один из этих методов лучше другого? Я лично предпочитаю использовать подход с регулярным выражением, как он лаконичен, но будет ли он выполняться по параметру, если он вызван, итерации, скажем, списка из нескольких сотен тысяч строк?
Примечание. Поскольку я новичок на сайте, я не совсем понимаю этот бизнес сообщества Wiki, поэтому, если это относится к нему, дайте мне знать, и я с радостью переведу его.
EDIT: Со всеми предложениями TryParse я поместил код сравнения Asaph (спасибо за отличный пост!) На С# и добавил метод TryParse. И, как кажется, TryParse выигрывает руки. Тем не менее, подход try catch занял безумное количество времени. Насколько я думаю, я сделал что-то не так! Я также обновил регулярное выражение для обработки отрицательных и десятичных точек.
Результаты для обновленного кода С#:
00:00:51.7390000 for isIntegerParseInt
00:00:03.9110000 for isIntegerRegex
00:00:00.3500000 for isIntegerTryParse
Использование:
static bool isIntegerParseInt(string str) {
try {
int.Parse(str);
return true;
} catch (FormatException e){}
return false;
}
static bool isIntegerRegex(string str) {
return Regex.Match(str, "^-?[0-9]+(\\.[0-9]+)?$").Success;
}
static bool isIntegerTryParse(string str) {
int bob;
return Int32.TryParse(str, out bob);
}