Atoi в Java для отрицательных значений

Я пишу функцию Atoi на Java. Он отлично работает для + ve целых чисел. Но я хочу, чтобы когда я ввожу отрицательное целое число, это должно было дать мне ошибку. Поэтому я попытался включить оператор continue в свой класс Atoi. Реализованный класс:

class Atoi {

    int atoi(String tmp) {

    int result = 0;

        for (int i = 0; i < tmp.length(); i++) {

            char digit = (char)(tmp.charAt(i) - '0');

        if(digit == '-')

        continue;
        }

        else {

            result += (digit * Math.pow(10, (tmp.length() - i - 1)));
        }

    return result;

    }
}   

Но, к сожалению, это дает мне отрицательный эквивалент символа, то есть для -12 это дает мне 655312! Помощь.

EDIT: Предположим, мне нужно проверить числа с плавающей запятой, что мне делать? Если я ввожу 12.1 или 123.2, он должен вернуть 12.1 и 123.2 соответственно!!


person Chandeep    schedule 06.11.2012    source источник


Ответы (6)


Быстрое решение очевидной проблемы: неправильный порядок логики...

Вместо

    char digit = (char)(tmp.charAt(i) - '0');
    if(digit=='-')
    continue;

пытаться

    char origChar=tmp.charAt(i);
    if(origChar=='-')
        continue;
    char digit = (char)(origChar - '0');

Но есть еще две проблемы:

  • это не отрицает значение, если присутствует символ '-'!
  • что, если это входная строка: -1-2-3-4-5? Результат будет интересным! РЕДАКТИРОВАТЬ: попробуйте также этот ввод: 'repa'... Еще более интересный результат!

Не забудьте проверить и с неправильными входными данными, и, как предложил @Klaus, не стесняйтесь генерировать исключение (предпочтительно IllegalArgumentException) с правильным сообщением об ошибке, если функция получает неверный ввод...

person ppeterka    schedule 06.11.2012
comment
1-й случай решен. Я использовал отрицательную переменную, инициализированную до 0. Если происходит -, она увеличивается на 1.. поэтому, если отрицательное == 1, знак - появляется перед числом.. вторая проблема все еще пытается выяснить ! примет ваш ответ через 11 минут! ;) - person Chandeep; 06.11.2012
comment
Подсказка: я думаю, что только первый символ может быть "-", эту информацию можно использовать... - person ppeterka; 06.11.2012
comment
Предположим, мне нужно проверить числа с плавающей запятой, что мне делать? если я ввожу 12.1 или 123.2, он должен вернуть 12.1 и 123.2 соответственно!! - person Chandeep; 06.11.2012
comment
Вы должны проверить наличие '.' символ, и после того, как он встречается, добавить дроби к результату. - person ppeterka; 07.11.2012

Вместо continue вы должны выдать ошибку (сбросить исключение, return -1 или что вы имеете в виду под "выдать ошибку").

Если вы хотите игнорировать -, вы можете изменить предложение else на:

result = digit + result * 10;
person Klas Lindbäck    schedule 06.11.2012
comment
+1 Это гораздо элегантнее (и быстрее), чем использование Math.pow на каждой итерации. Хотя к такому мышлению нужно привыкнуть... Но настоящая проблема в том, что он тоже хочет иметь дело с отрицательными числами! - person ppeterka; 06.11.2012
comment
Предположим, мне нужно проверить числа с плавающей запятой, что мне делать? если я ввожу 12.1 или 123.2, он должен вернуть 12.1 и 123.2 соответственно!! - person Chandeep; 06.11.2012

Если это не делается как упражнение по программированию, есть более простое решение:

  static int atoi(String tmp)
  {
      int result = Integer.parseInt(tmp);
      if(result >= 0) {
         return result;
      } else {
         throw new IllegalArgumentException("Negative string "+"\"" + tmp + "\"");
      }
  }

Замените соответствующее исключение или другое действие в случае отрицательного результата. Если вы хотите просто игнорировать «-», как в опубликованном коде, замените if-then-else на:

      return Math.abs(result);

Этот код также создает исключение для таких строк, как «abc».

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

person Patricia Shanahan    schedule 06.11.2012

Вы, конечно, можете написать такой код, но вам нужно проверить, что tmp является допустимым числом.

int atoi(String tmp) {

    int result = 0;

    int factor = tmp.charAt(0) == "-" ? -1 : 1;

        for (int i = 0; i < tmp.length(); i++) {

            if (tmp.chatAt(i) < '0' ||  tmp.chatAt(i) > '9') 

                continue;

                char digit = (char)(tmp.charAt(i) - '0');

                result += (digit * Math.pow(10, (tmp.length() - i - 1)));
        }

        return result * factor;
}
person user902383    schedule 06.11.2012

if(digit=='-')

С

(char)(tmp.charAt(i)

Ваш код предполагает, что нет -

(char)(tmp.charAt(i) - '0');

Это оптимизация, которая слепо привязывает переменную «цифра» к числу.

Вам нужно пройти через то, что на самом деле делает ваш код, найти диаграмму ASCII и разобраться, что делает вычитание «0» («0» == 48), поэтому «1» (49) - «0» (48 ) = 1 и т.д...

person Louis Ricci    schedule 06.11.2012

Если вы не хотите преобразовывать отрицательные числа, просто возвращайте 0 всякий раз, когда вы встречаете знак -, вместо того, чтобы продолжать цикл. Поместите этот код перед блоком if-else.

     if(tmp.charAt(i)=='-')  
         return 0;
person Abubakkar    schedule 06.11.2012
comment
Так не пойдет. Поскольку digit никогда не будет -. Внимательно посмотрите на код. - person Rohit Jain; 06.11.2012
comment
Да, это подойдет. Но цитируйте это, это должно быть перед блоком if-else. На самом деле после этого if-else не нужен. - person Rohit Jain; 06.11.2012