Здесь можно найти ISO - http://www.kubuntu.org/getkubuntu/download
Я только что провел несколько тестов производительности этих двух методов (на Macbook Pro OSX Leopard Java 6). ParseInt работает быстрее. Вот результат:
This operation took 1562 ms.
This operation took 2251 ms.
А вот мой тестовый код:
public class IsIntegerPerformanceTest {
public static boolean isIntegerParseInt(String str) {
try {
Integer.parseInt(str);
return true;
} catch (NumberFormatException nfe) {}
return false;
}
public static boolean isIntegerRegex(String str) {
return str.matches("^[0-9]+$");
}
public static void main(String[] args) {
long starttime, endtime;
int iterations = 1000000;
starttime = System.currentTimeMillis();
for (int i=0; i<iterations; i++) {
isIntegerParseInt("123");
isIntegerParseInt("not an int");
isIntegerParseInt("-321");
}
endtime = System.currentTimeMillis();
System.out.println("This operation took " + (endtime - starttime) + " ms.");
starttime = System.currentTimeMillis();
for (int i=0; i<iterations; i++) {
isIntegerRegex("123");
isIntegerRegex("not an int");
isIntegerRegex("-321");
}
endtime = System.currentTimeMillis();
System.out.println("This operation took " + (endtime - starttime) + " ms.");
}
}
Также обратите внимание, что ваше регулярное выражение будет отклонять отрицательные числа, а метод parseInt их примет.
Я использую это, но мне понравилась строгость Асафа в его сообщении.
public static bool IsNumeric(object expression)
{
if (expression == null)
return false;
double number;
return Double.TryParse(Convert.ToString(expression, CultureInfo.InvariantCulture), NumberStyles.Any,
NumberFormatInfo.InvariantInfo, out number);
}
Используя .NET, вы могли бы сделать что-то вроде:
private bool isNumber(string str)
{
return str.Any(c => !char.IsDigit(c));
}
Вы можете создать метод расширения для строки и сделать весь процесс более чистым ...
public static bool IsInt(this string str)
{
int i;
return int.TryParse(str, out i);
}
Затем вы можете сделать следующее в своем реальном коде ...
if(myString.IsInt())....
В некоторых языках, например C #, есть TryParse (или эквивалент), который неплохо работает для чего-то вроде этого.
public boolean IsInteger(string value)
{
int i;
return Int32.TryParse(value, i);
}
Лично я бы сделал это если вы действительно хотите упростить его.
public boolean isInteger(string myValue)
{
int myIntValue;
return int.TryParse(myValue, myIntValue)
}
Если абсолютная производительность является ключевой, и если вы просто проверяете целые числа (а не числа с плавающей запятой), я подозреваю, что повторение каждого символа в строка, возвращающая false, если вы обнаружите что-то не в диапазоне 0-9, будет самым быстрым.
RegEx - это более универсальное решение, поэтому, вероятно, не будет работать так быстро в этом частном случае. В этом случае решение, генерирующее исключение, будет иметь дополнительные накладные расходы. TryParse будет немного медленнее, если вам на самом деле не важно значение числа, независимо от того, является ли оно числом,
Вот наш способ сделать это:
public boolean isNumeric(String string) throws IllegalArgumentException
{
boolean isnumeric = false;
if (string != null && !string.equals(""))
{
isnumeric = true;
char chars[] = string.toCharArray();
for(int d = 0; d < chars.length; d++)
{
isnumeric &= Character.isDigit(chars[d]);
if(!isnumeric)
break;
}
}
return isnumeric;
}