JAVA: Попытка написать метод, который проверяет, является ли строка числовой. Всегда возвращаю ложь - PullRequest
0 голосов
/ 18 марта 2012

Я пытаюсь написать метод, который проверяет, содержит ли строка только цифры. По некоторым причинам он возвращает false, даже если я ввожу строку, содержащую «1234». Я предполагаю, что моя проблема с оператором if, но я не уверен, что нужно сделать, чтобы это исправить.

public static boolean isNumeric(String input)
{
    input.trim();

    for (int count=0; count<=input.length(); count++)
    {

        if (input.substring(count) == "0" || input.substring(count) == "1"||
        input.substring(count) == "2" || input.substring(count) == "3" ||
        input.substring(count) == "4" || input.substring(count) == "5" ||
        input.substring(count) == "6" || input.substring(count) == "7" ||
        input.substring(count) == "8" || input.substring(count) == "9")
        {
            integerstate = true;
        }

        else
        {
            integerstate = false;
            break;
        }

    }

return integerstate;
}

Кто-нибудь видит, в чем проблема?

Ответы [ 10 ]

5 голосов
/ 18 марта 2012

@ Ответ Кэла буквально правильный, но, боже мой, @Petefic, это ужасно неэффективный способ сделать что-то.В классе Character есть метод, который проверяет, является ли char цифрой, и вы можете просто извлечь каждый символ один раз вместо того, чтобы вызывать substring() столько раз.

Например, вы можете сделать

 public static boolean isNumeric(String input) {
     input = input.trim();
     for (char c: input.toCharArray()) {
         if (Character.isDigit(c))
           return true;
     }
     return false;
 }

Для числа 99999 ваш код будет производить более 50 новых объектов;это даст один (массив из toCharArray().)

Я вижу несколько других ответов, которые предлагают использовать Integer.parseInt() и перехватывать исключение.Это не ужасная идея, но на самом деле это не очень хорошая идея, если многие строки не будут числами.Бросать и ловить исключение очень дорого в вычислительном отношении;многие объекты создаются в процессе.Этого следует избегать в тех случаях, когда фактическое восстановление после ошибок не требуется.

4 голосов
/ 18 марта 2012

Используйте "0".equals(input.substring(count) ) вместо ==

== проверяет равенство объектов, а не равенство строк

См. этот вопрос о том, как сделать это так, как предлагает @Ernest.

2 голосов
/ 18 марта 2012
public static boolean isNumeric(String input) {
    Pattern pattern = Pattern.compile("[0-9]*");
    Matcher isNum = pattern.matcher(input);
    if (isNum.matches()) {
        return true;
    }
    return false;
}
1 голос
/ 18 марта 2012

Вы можете позволить комплекту инструментов выполнять «тяжелую работу».

class TestForIntegers {
    public static void main(String[] args) {
        String s = "blah";
        System.out.println(s + " is integer: " + isInteger(s));
        s = "1234";
        System.out.println(s + " is integer: " + isInteger(s));
        s = "max123";
        System.out.println(s + " is integer: " + isInteger(s));
    }

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

выход

blah is integer: false
1234 is integer: true
max123 is integer: false
Press any key to continue . . .
1 голос
/ 18 марта 2012

Как сказал Кэл, оператор == определяет, являются ли объекты одним и тем же объектом, а не имеют ли они одинаковое значение.С Java это часто дает вам один и тот же результат, что может усложнить понимание того, почему использование == для сравнения строк неправильно.Иногда это будет работать, потому что Java интернирует Strings с пулом String, что означает, что Java обычно будет хранить только одну String каждого значения.Другими словами, если String x и String y оба имеют значение «asdf», пул строк будет хранить «asdf» только один раз, и оба x и y будут ссылаться на этот объект String.Единственный способ заставить Java фактически создать дублирующийся объект String - это ключевое слово «new».Я думаю, что в этом случае == не работает из-за подстроки.В любом случае, если вы на самом деле не проверяете, являются ли объекты, на которые ссылаются, одинаковыми, всегда используйте .equals ().

1 голос
/ 18 марта 2012

Другим вариантом будет использование charAt () вместо подстроки и сравнение с «0», «1» и т. Д. Затем вы можете использовать ==.Однако гораздо более эффективным способом было бы использование регулярных выражений.

0 голосов
/ 18 марта 2012

Причиной этого является разница между == и equals ().

Это происходит потому, что == сравнение для точного равенства означает, что два объекта должны быть одинаковыми.в то время как equal () сравнить для значимого равенства означает, что объект может не совпадать, но значение, которое они содержат, по сути одинаково.

0 голосов
/ 18 марта 2012
// Bad
for (int count=0; count<=input.length(); count++)
{
  if (input.substring(count) == "0" || input.substring(count) == "1"||
      input.substring(count) == "2" || input.substring(count) == "3" ||
      input.substring(count) == "4" || input.substring(count) == "5" ||
      input.substring(count) == "6" || input.substring(count) == "7" ||
      input.substring(count) == "8" || input.substring(count) == "9")
  {
      integerstate = true;
      ...

// Better
for (int count=0; count<=input.length(); count++)
{
   if (input.substring(count).equals("0") || ...
      ...

// Much better
try {
  Integer.parseInt( input );  
  integerstate = true;
}  
catch ...
0 голосов
/ 18 марта 2012

В java для проверки на равенство двух строк или сравнения их необходимо использовать equals (), так как equals () выполняет сравнение содержимого. Но '==' выполняет сравнение ссылок, поэтому он просто проверяет, указывают ли две ссылки на обеих сторонах '==' на один и тот же объект или нет.

0 голосов
/ 18 марта 2012

Вы должны использовать метод equals для равенства String.

А если вы хотите использовать его наоборот, рассмотрите возможность преобразования substrings с использованием Integer.parseInt(), а затем вы можете использовать == 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...