Нужно реализовать метод без использования parseInt. Подскажите основной алгоритм как это сделать ?
Очередная лаба.
Значит для начала проверяем, является ли первый символ символом "-" и если является, то какой-нибудь переменной выставляем флажок. Это будет признаком знаковости. Чтобы все опупели, можно проверять символы юникода, похожие на минус - их около 2х десятков: https://www.compart.com/en/unicode/category/Pd (был какой-то китайский сайт с более приличным списком, но мне искать его лень)
Далее, инициализируем наш аккумулятор в 0 и начинаем его заполнять цифирками. Если встречаем цифирку - по сложнейшей формуле используем ее аккум=аккум*10+цифирка. Этому учат где-то в районе 3-го класса средней школы.
Если мы встречаем точку или запятую, то ее можно принять за дробную часть. Это, между прочим, реальная потребность для написания подобных велосипедов - если надо парсить числа вида 100.000.000,10 или 100,000,000.10.
Чтобы препод писал кипятком, то надо правильно обрабатывать ошибки. К примеру, пробелы в записях вида 100 000 000 можно игнорить, а можно выбрасывать ошибки. Можно попытаться обрабатывать нецифровые символы - выбрасывать ошибки или подставлять их как константы, парсить слова вида "одна тысяча девятьсот тысяч семьсот миллионов трицать пи копеек без ндс" - все, что душе угодно. В общем, можно развлекаться как умеешь.
По следам идеи @АлексейШиманский - я бы написал так:
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;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть приложение, написанное на Spring BootДля сборки используется gradle
Почему могут не работать медиа запросы? Делаю все как положено: сами запросы всегда идут в конце документа, написаны без ошибок @media screen and (max-width:...
Есть несколько объектов у которых есть класс Бизнес, Эконом и КомфортЕсли выбрать в filter-class(это select) класс Бизнес, то страница result