Преобразование String to Int без parseInt

173
06 июля 2017, 00:55

Нужно реализовать метод без использования parseInt. Подскажите основной алгоритм как это сделать ?

Answer 1

Очередная лаба.

Значит для начала проверяем, является ли первый символ символом "-" и если является, то какой-нибудь переменной выставляем флажок. Это будет признаком знаковости. Чтобы все опупели, можно проверять символы юникода, похожие на минус - их около 2х десятков: https://www.compart.com/en/unicode/category/Pd (был какой-то китайский сайт с более приличным списком, но мне искать его лень)

Далее, инициализируем наш аккумулятор в 0 и начинаем его заполнять цифирками. Если встречаем цифирку - по сложнейшей формуле используем ее аккум=аккум*10+цифирка. Этому учат где-то в районе 3-го класса средней школы.

Если мы встречаем точку или запятую, то ее можно принять за дробную часть. Это, между прочим, реальная потребность для написания подобных велосипедов - если надо парсить числа вида 100.000.000,10 или 100,000,000.10.

Чтобы препод писал кипятком, то надо правильно обрабатывать ошибки. К примеру, пробелы в записях вида 100 000 000 можно игнорить, а можно выбрасывать ошибки. Можно попытаться обрабатывать нецифровые символы - выбрасывать ошибки или подставлять их как константы, парсить слова вида "одна тысяча девятьсот тысяч семьсот миллионов трицать пи копеек без ндс" - все, что душе угодно. В общем, можно развлекаться как умеешь.

Answer 2

По следам идеи @АлексейШиманский - я бы написал так:

private int convert(String s) {
   s=s.trim(); //освобождаемся от пробелов спереди и сзади
   int digit;
   int value=0;
   int order=1;
   for(int i=s.length()-1; i >= 0; i--) {
      digit=charToDigit(s.charAt(i));
      if(digit < 0)
         throw new NumberFormatException();
      value+=digit*order;
      order*=10;
   }
   return value;
}
private int charToDigit(final char ch) {
   final String digits="0123456789";
   return digits.indexOf(ch);
}     

Update

Можно тупо выдрать исходники parseInt() (параметр radix - здесь означает основание):

public static int parseInt(String s, int radix)
            throws NumberFormatException
{
    if (s == null) {
        throw new NumberFormatException("null");
    }
    if (radix < Character.MIN_RADIX) {
        throw new NumberFormatException("radix " + radix +
                                        " less than Character.MIN_RADIX");
    }
    if (radix > Character.MAX_RADIX) {
        throw new NumberFormatException("radix " + radix +
                                        " greater than Character.MAX_RADIX");
    }
    int result = 0;
    boolean negative = false;
    int i = 0, len = s.length();
    int limit = -Integer.MAX_VALUE;
    int multmin;
    int digit;
    if (len > 0) {
        char firstChar = s.charAt(0);
        if (firstChar < '0') { // Possible leading "-"
            if (firstChar == '-') {
                negative = true;
                limit = Integer.MIN_VALUE;
            } else
                throw NumberFormatException.forInputString(s);
            if (len == 1) // Cannot have lone "-"
                throw NumberFormatException.forInputString(s);
            i++;
        }
        multmin = limit / radix;
        while (i < len) {
            // Accumulating negatively avoids surprises near MAX_VALUE
            digit = Character.digit(s.charAt(i++),radix);
            if (digit < 0) {
                throw NumberFormatException.forInputString(s);
            }
            if (result < multmin) {
                throw NumberFormatException.forInputString(s);
            }
            result *= radix;
            if (result < limit + digit) {
                throw NumberFormatException.forInputString(s);
            }
            result -= digit;
        }
    } else {
        throw NumberFormatException.forInputString(s);
    }
    return negative ? result : -result;
}
READ ALSO
Конфигурация Spring Boot с использованием gradle

Конфигурация Spring Boot с использованием gradle

Есть приложение, написанное на Spring BootДля сборки используется gradle

156
По каким причинам могут не работать меди запросы?

По каким причинам могут не работать меди запросы?

Почему могут не работать медиа запросы? Делаю все как положено: сами запросы всегда идут в конце документа, написаны без ошибок @media screen and (max-width:...

233
Выборка всех объектов из БД на страницу

Выборка всех объектов из БД на страницу

Есть несколько объектов у которых есть класс Бизнес, Эконом и КомфортЕсли выбрать в filter-class(это select) класс Бизнес, то страница result

189