Ручное преобразование строки в целое число в Java

У меня есть строка, состоящая из последовательности цифр (например, "1234"). Как вернуть String как int без использования функций библиотеки Java, таких как Integer.parseInt?

public class StringToInteger {
  public static void main(String [] args){
    int i = myStringToInteger("123");
    System.out.println("String decoded to number " + i);
  }

  public int myStringToInteger(String str){
      /* ... */
  }
}

Ответ 1

И что не так с этим?

int i = Integer.parseInt(str);

EDIT:

Если вам действительно нужно выполнить преобразование вручную, попробуйте следующее:

public static int myStringToInteger(String str) {
    int answer = 0, factor = 1;
    for (int i = str.length()-1; i >= 0; i--) {
        answer += (str.charAt(i) - '0') * factor;
        factor *= 10;
    }
    return answer;
}

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

Ответ 2

Если стандартные библиотеки не разрешены, существует множество подходов к решению этой проблемы. Один из способов думать об этом - рекурсивная функция:

  • Если n меньше 10, просто преобразуйте его в односимвольную строку, содержащую ее цифру. Например, 3 становится "3".
  • Если n больше 10, то используйте деление и модуль для получения последней цифры n и числа, образованного путем исключения последней цифры. Рекурсивно получить строку для первых цифр, а затем добавить соответствующий символ для последней цифры. Например, если n равно 137, вы бы рекурсивно вычислили "13" и применили "7", чтобы получить "137".

Вам понадобится логика для особых случаев 0 и отрицательных чисел, но в противном случае это можно сделать довольно просто.

Поскольку я подозреваю, что это может быть домашнее задание (и знать, что в некоторых школах это так), я оставлю фактическое преобразование в качестве упражнения для читателя.: -)

Надеюсь, это поможет!

Ответ 3

Используйте long вместо int в этом случае. Вам нужно проверить переполнение.

public static int StringtoNumber(String s) throws Exception{
    if (s == null || s.length() == 0)
        return 0;
    while(s.charAt(0) == ' '){
        s = s.substring(1);
    }
    boolean isNegative = s.charAt(0) == '-';
    if (s.charAt(0) == '-' || (s.charAt(0) == '+')){
        s = s.substring(1);
    }

    long result = 0l;
    for (int i = 0; i < s.length(); i++){
        int value = s.charAt(i) - '0';
        if (value >= 0 && value <= 9){
            if (!isNegative && 10 * result + value > Integer.MAX_VALUE ){
                throw new Exception();
            }else if (isNegative && -1 * 10 * result - value < Integer.MIN_VALUE){
                throw new Exception();
            }
            result = 10 * result + value;
        }else if (s.charAt(i) != ' '){
            return (int)result;
        }
    }
    return isNegative ? -1 * (int)result : (int)result;
}

Ответ 4

Альтернативный подход к уже опубликованному ответу. Вы можете пересечь строку с фронта и построить номер

 public static void stringtoint(String s){      
    boolean isNegative=false;
    int number =0;      
    if (s.charAt(0)=='-') {
        isNegative=true;            
    }else{
        number = number* 10 + s.charAt(0)-'0';
    }

    for (int i = 1; i < s.length(); i++) {

        number = number*10 + s.charAt(i)-'0';           
    }
    if(isNegative){
        number = 0-number;
    }
    System.out.println(number);
}

Ответ 5

Вы можете сделать так: из строки создайте массив символов для каждого элемента, сохраните индекс и умножьте его значение ASCII на силу фактического обратного индекса. Суммируйте частичные факторы, и вы получите их.

Есть только небольшое приложение для использования Math.pow (поскольку он возвращает двойной), но вы можете избежать этого, создав свою собственную функцию мощности.

public static int StringToInt(String str){
    int res = 0;
    char [] chars = str.toCharArray();
    System.out.println(str.length());
    for (int i = str.length()-1, j=0; i>=0; i--, j++){
        int temp = chars[j]-48;
        int power = (int) Math.pow(10, i);
        res += temp*power;
        System.out.println(res);
    }
    return res;
}

Ответ 6

Учитывая правильный намек, я думаю, что большинство людей с образованием в средней школе могут решить эту проблему самостоятельно. Каждый знает 134 = 100x1 + 10x3 + 1x4

Ключевая часть, которую большинство людей пропускает, заключается в том, что если вы делаете что-то подобное в Java

 System.out.println('0'*1);//48

он выберет десятичное представление символа 0 в диаграмме ascii и умножьте его на 1.

В таблица ascii символ 0 имеет десятичное представление 48. Таким образом, вышеприведенная строка будет печатать 48. Так что если вы делаете что-то вроде" 1 '-' 0 'То же, что и у 49-48. Поскольку в диаграмме ascii символы 0-9 непрерывны, вы можете взять любой char от 0 до 9 и вычесть 0, чтобы получить его целочисленное значение. Когда у вас есть целочисленное значение для символа, преобразование всей строки в int выполняется прямо.

Вот еще одно решение проблемы

String a = "-12512";
char[] chars = a.toCharArray();
boolean isNegative = (chars[0] == '-');
if (isNegative) {
    chars[0] = '0';
}

int multiplier = 1;
int total = 0;

for (int i = chars.length - 1; i >= 0; i--) {
    total = total + ((chars[i] - '0') * multiplier);
    multiplier = multiplier * 10;
}

if (isNegative) {
    total = total * -1;
}

Ответ 7

Используйте это:

static int parseInt(String str) {
    char[] ch = str.trim().toCharArray();
    int len = ch.length;
    int value = 0;
    for (int i=0, j=(len-1); i<len; i++,j--) {
        int c = ch[i];
        if (c < 48 || c > 57) {
            throw new NumberFormatException("Not a number: "+str);
        }
        int n = c - 48;
        n *= Math.pow(10, j);
        value += n;
    }
    return value;
}

И, кстати, вы можете обрабатывать специальный случай отрицательных целых чисел, иначе он будет вызывать исключение NumberFormatException.

Ответ 8

Используйте тот факт, что Java использует char и int таким же образом. В принципе, do char - '0', чтобы получить значение int char.

public class StringToInteger {
    public static void main(String[] args) {
        int i = myStringToInteger("123");
        System.out.println("String decoded to number " + i);
    }

    public static int myStringToInteger(String str) {
        int sum = 0;
        char[] array = str.toCharArray();
        int j = 0;
        for(int i = str.length() - 1 ; i >= 0 ; i--){
            sum += Math.pow(10, j)*(array[i]-'0');
            j++;
        }
        return sum;
    }
}

Ответ 9

public int myStringToInteger(String str) throws NumberFormatException 
{
    int decimalRadix = 10; //10 is the radix of the decimal system

    if (str == null) {
        throw new NumberFormatException("null");
    }

    int finalResult = 0;
    boolean isNegative = false;
    int index = 0, strLength = str.length();

    if (strLength > 0) {
        if (str.charAt(0) == '-') {
            isNegative = true;
            index++;
        } 

        while (index < strLength) {

            if((Character.digit(str.charAt(index), decimalRadix)) != -1){   
                finalResult *= decimalRadix;
                finalResult += (str.charAt(index) - '0');
            } else throw new NumberFormatException("for input string " + str);

            index++;
        }

    } else {
        throw new NumberFormatException("Empty numeric string");
    }

    if(isNegative){
        if(index > 1)
            return -finalResult;
        else
            throw new NumberFormatException("Only got -");
    }

    return finalResult;
}

Результат: 1) Для ввода "34567" конечным результатом будет: 34567 2) Для входа "-4567" конечным результатом будет: -4567 3) Для ввода "-" конечным результатом будет: java.lang.NumberFormatException: Только получил - 4) Для ввода "12ab45" конечным результатом будет: java.lang.NumberFormatException: для строки ввода 12ab45

Ответ 10

public static int convertToInt(String input){
        char[] ch=input.toCharArray();
        int result=0;
        for(char c : ch){
            result=(result*10)+((int)c-(int)'0');
        }
        return result;
    }

Ответ 11

Возможно, этот способ будет немного быстрее:

public static int convertStringToInt(String num) {
     int result = 0;

     for (char c: num.toCharArray()) {
        c -= 48;
        if (c <= 9) {
            result = (result << 3) + (result << 1) + c;
        } else return -1;
    }
    return result;
}

Ответ 12

Используя Java 8, вы можете сделать следующее:

public static int convert(String strNum)
{
   int result =strNum.chars().reduce(0, (a, b)->10*a +b-'0');
}
  • Преобразовать srtNum в char
  • для каждого char (представленного как 'b') → 'b' -'0 'даст относительное число
  • sum all in a (начальное значение равно 0) (каждый раз, когда мы выполняем операнд на char do → a = a * 10

Ответ 13

Это полная программа со всеми положительными, отрицательными условиями без использования библиотеки

import java.util.Scanner;
public class StringToInt {
 public static void main(String args[]) {
  String inputString;
  Scanner s = new Scanner(System.in);
  inputString = s.nextLine();

  if (!inputString.matches("([+-]?([0-9]*[.])?[0-9]+)")) {
   System.out.println("error!!!");
  } else {
   Double result2 = getNumber(inputString);
   System.out.println("result = " + result2);
  }

 }
 public static Double getNumber(String number) {
  Double result = 0.0;
  Double beforeDecimal = 0.0;
  Double afterDecimal = 0.0;
  Double afterDecimalCount = 0.0;
  int signBit = 1;
  boolean flag = false;

  int count = number.length();
  if (number.charAt(0) == '-') {
   signBit = -1;
   flag = true;
  } else if (number.charAt(0) == '+') {
   flag = true;
  }
  for (int i = 0; i < count; i++) {
   if (flag && i == 0) {
    continue;

   }
   if (afterDecimalCount == 0.0) {
    if (number.charAt(i) - '.' == 0) {
     afterDecimalCount++;
    } else {
     beforeDecimal = beforeDecimal * 10 + (number.charAt(i) - '0');
    }

   } else {
    afterDecimal = afterDecimal * 10 + number.charAt(i) - ('0');
    afterDecimalCount = afterDecimalCount * 10;
   }
  }
  if (afterDecimalCount != 0.0) {
   afterDecimal = afterDecimal / afterDecimalCount;
   result = beforeDecimal + afterDecimal;
  } else {
   result = beforeDecimal;
  }

  return result * signBit;
 }
}