Вопрос-ответ

What's the best way to check if a String represents an integer in Java?

Какой лучший способ проверить, представляет ли строка целое число в Java?

Обычно я использую следующую идиому, чтобы проверить, может ли строка быть преобразована в целое число.

public boolean isInteger( String input ) {
try {
Integer.parseInt( input );
return true;
}
catch( Exception e ) {
return false;
}
}

Мне кажется, или это кажется немного халтурным? Какой способ лучше?


Посмотрите мой ответ (с бенчмарками, основанный на более раннем ответе от CodingWithSpike ), чтобы понять, почему я изменил свою позицию и принял ответ Джонаса Клемминга на эту проблему. Я думаю, что этот исходный код будет использоваться большинством людей, потому что он быстрее в реализации и более удобен в обслуживании, но работает на порядки медленнее, когда предоставляются нецелочисленные данные.

Переведено автоматически
Ответ 1

Если вас не беспокоят потенциальные проблемы с переполнением, эта функция будет выполняться примерно в 20-30 раз быстрее, чем при использовании Integer.parseInt().

public static boolean isInteger(String str) {
if (str == null) {
return false;
}
int length = str.length();
if (length == 0) {
return false;
}
int i = 0;
if (str.charAt(0) == '-') {
if (length == 1) {
return false;
}
i = 1;
}
for (; i < length; i++) {
char c = str.charAt(i);
if (c < '0' || c > '9') {
return false;
}
}
return true;
}
Ответ 2

У вас это есть, но вы должны только перехватывать NumberFormatException.

Ответ 3

Провел быстрый тест. Исключения на самом деле не такие уж дорогие, если только вы не начнете возвращать несколько методов, и JVM не придется проделывать большую работу, чтобы установить стек выполнения на место. Оставаясь в том же методе, они неплохо работают.

 public void RunTests()
{
String str = "1234567890";

long startTime = System.currentTimeMillis();
for(int i = 0; i < 100000; i++)
IsInt_ByException(str);
long endTime = System.currentTimeMillis();
System.out.print("ByException: ");
System.out.println(endTime - startTime);

startTime = System.currentTimeMillis();
for(int i = 0; i < 100000; i++)
IsInt_ByRegex(str);
endTime = System.currentTimeMillis();
System.out.print("ByRegex: ");
System.out.println(endTime - startTime);

startTime = System.currentTimeMillis();
for(int i = 0; i < 100000; i++)
IsInt_ByJonas(str);
endTime = System.currentTimeMillis();
System.out.print("ByJonas: ");
System.out.println(endTime - startTime);
}

private boolean IsInt_ByException(String str)
{
try
{
Integer.parseInt(str);
return true;
}
catch(NumberFormatException nfe)
{
return false;
}
}

private boolean IsInt_ByRegex(String str)
{
return str.matches("^-?\\d+$");
}

public boolean IsInt_ByJonas(String str)
{
if (str == null) {
return false;
}
int length = str.length();
if (length == 0) {
return false;
}
int i = 0;
if (str.charAt(0) == '-') {
if (length == 1) {
return false;
}
i = 1;
}
for (; i < length; i++) {
char c = str.charAt(i);
if (c <= '/' || c >= ':') {
return false;
}
}
return true;
}

Вывод:


Исключение ByException: 31


ByRegex: 453 (примечание: каждый раз перекомпилируйте шаблон)


Автор: 16


Я согласен, что решение Джонаса К. также является наиболее надежным. Похоже, он выигрывает :)

Ответ 4
org.apache.commons.lang.StringUtils.isNumeric 

хотя в стандартной библиотеке Java действительно отсутствуют такие служебные функции

Я думаю, что Apache Commons "must have" для каждого Java-программиста

жаль, что это еще не портировано на Java5

2024-02-03 09:35 java string