Лучшая реализация для isNumber (строка) метод

Здесь можно найти ISO - http://www.kubuntu.org/getkubuntu/download

18
задан ManoDestra 27 September 2016 в 16:46
поделиться

8 ответов

Я только что провел несколько тестов производительности этих двух методов (на 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 их примет.

13
ответ дан 30 November 2019 в 07:33
поделиться

Я использую это, но мне понравилась строгость Асафа в его сообщении.

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);
}
0
ответ дан 30 November 2019 в 07:33
поделиться

Используя .NET, вы могли бы сделать что-то вроде:

private bool isNumber(string str)
{
    return str.Any(c => !char.IsDigit(c));
}
1
ответ дан 30 November 2019 в 07:33
поделиться

Вы можете создать метод расширения для строки и сделать весь процесс более чистым ...

public static bool IsInt(this string str)
{
    int i;
    return int.TryParse(str, out i);
}

Затем вы можете сделать следующее в своем реальном коде ...

if(myString.IsInt())....
2
ответ дан 30 November 2019 в 07:33
поделиться

В некоторых языках, например C #, есть TryParse (или эквивалент), который неплохо работает для чего-то вроде этого.

public boolean IsInteger(string value)
{
  int i;
  return Int32.TryParse(value, i);
}
2
ответ дан 30 November 2019 в 07:33
поделиться

Лично я бы сделал это если вы действительно хотите упростить его.

public boolean isInteger(string myValue)
{
    int myIntValue;
    return int.TryParse(myValue, myIntValue)
}
2
ответ дан 30 November 2019 в 07:33
поделиться

Если абсолютная производительность является ключевой, и если вы просто проверяете целые числа (а не числа с плавающей запятой), я подозреваю, что повторение каждого символа в строка, возвращающая false, если вы обнаружите что-то не в диапазоне 0-9, будет самым быстрым.

RegEx - это более универсальное решение, поэтому, вероятно, не будет работать так быстро в этом частном случае. В этом случае решение, генерирующее исключение, будет иметь дополнительные накладные расходы. TryParse будет немного медленнее, если вам на самом деле не важно значение числа, независимо от того, является ли оно числом,

3
ответ дан 30 November 2019 в 07:33
поделиться

Вот наш способ сделать это:

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;
}
4
ответ дан 30 November 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: