web-dev-qa-db-fra.com

Conversion manuelle d'une chaîne en un entier en Java

J'ai une chaîne composée d'une séquence de chiffres (par exemple, "1234"). Comment renvoyer la String en tant que int sans utiliser les fonctions de bibliothèque de Java telles que 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){
      /* ... */
  }
}
12
Manu

Et quel est le problème avec cela?

int i = Integer.parseInt(str);

MODIFIER :

Si vous vraiment devez effectuer la conversion à la main, essayez ceci:

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;
}

Ce qui précède fonctionnera bien pour les entiers positifs. Si le nombre est négatif, vous devrez d'abord vérifier un peu, mais je laisserai cela comme exercice pour le lecteur.

24
Óscar López

Si les bibliothèques standard ne sont pas autorisées, plusieurs solutions permettent de résoudre ce problème. Une façon de penser à cela est comme une fonction récursive:

  1. Si n est inférieur à 10, convertissez-le simplement en chaîne de un caractère contenant son chiffre. Par exemple, 3 devient "3".
  2. Si n est supérieur à 10, utilisez division et module pour obtenir le dernier chiffre de n et le nombre formé en excluant le dernier chiffre. Obtenez récursivement une chaîne pour les premiers chiffres, puis ajoutez le caractère approprié pour le dernier chiffre. Par exemple, si n vaut 137, vous devez calculer "13" de manière récursive et ajouter "137" pour obtenir "137".

Vous aurez besoin de logique pour les cas spéciaux 0 et les nombres négatifs, mais sinon, cela peut être fait assez simplement.

Puisque je soupçonne que cela peut être un devoir (et que je sais que dans certaines écoles, c’est le cas), je laisserai au lecteur la conversion à proprement parler. :-)

J'espère que cela t'aides!

7
templatetypedef

Utilisez long au lieu de int dans ce cas. Vous devez vérifier les débordements. 

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
user1559897

Autre approche de la réponse déjà affichée ici. Vous pouvez traverser la chaîne de l'avant et construire le nombre

 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);
}
2
Sandy

Vous pouvez procéder comme suit: à partir de la chaîne, créez un tableau de caractères pour chaque élément, conservez l'index sauvegardé et multipliez sa valeur ASCII par la puissance de l'index inverse réel. Faites la somme des facteurs partiels et vous l'obtenez.

Math.pow (car il retourne un double) est une petite distribution, mais vous pouvez l'éviter en créant votre propre fonction d'alimentation.

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;
}
1
Rohi

Compte tenu du bon indice, je pense que la plupart des diplômés du secondaire peuvent résoudre le leur. Tout le monde sait 134 = 100x1 + 10x3 + 1x4

La partie principale qui manque à la plupart des gens est que si vous faites quelque chose comme ça en Java

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

il choisira la représentation décimale de caractère 0 dans ascii chart et le multipliera par 1.

Dans tableau ascii le caractère 0 a une représentation décimale de 48. La ligne ci-dessus imprimera donc 48. Si vous faites quelque chose comme '1' - '0', cela revient à 49-48. Comme dans le diagramme ascii, les caractères 0 à 9 sont continus, vous pouvez donc utiliser n'importe quel caractère de 0 à 9 et soustraire 0 pour obtenir sa valeur entière. Une fois que vous avez la valeur entière pour un caractère, la conversion de la chaîne entière en int est simple. 

Voici une autre solution au problème

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;
}
1
Arcturus

En utilisant Java 8, vous pouvez effectuer les opérations suivantes:

public static int convert(String strNum)
{
   int result =strNum.chars().reduce(0, (a, b)->10*a +b-'0');
}
  1. Convertir srtNum en char
  2. pour chaque caractère (représenté par 'b') -> 'b' -'0 'donnera le nombre relatif
  3. somme tout en a (la valeur initiale est 0) (chaque fois que nous effectuons une opération sur un caractère do -> a = a * 10 
1
user1386966
Works for Positive and Negative String Using TDD

//Solution

public int convert(String string) {
    int number = 0;
    boolean isNegative = false;
    int i = 0;
    if (string.charAt(0) == '-') {
        isNegative = true;
        i++;
    }

    for (int j = i; j < string.length(); j++) {
        int value = string.charAt(j) - '0';
        number *= 10;
        number += value;
    }
    if (isNegative) {
        number = -number;
    }

    return number;
}

// Testcases

public class StringtoIntTest {
private StringtoInt stringtoInt;


@Before
public void setUp() throws Exception {
stringtoInt = new StringtoInt();
}

@Test
public void testStringtoInt() {
    int excepted = stringtoInt.convert("123456");
    assertEquals(123456,excepted);
}

@Test
public void testStringtoIntWithNegative() {
    int excepted = stringtoInt.convert("-123456");
    assertEquals(-123456,excepted);
}

}

0
Sameer Shrestha
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;
    }
0

Utilisez ceci:

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;
}

Et au fait, vous pouvez gérer le cas particulier des entiers négatifs, sinon il lèvera une exception NumberFormatException .

0
maress

Profitez du fait que Java utilise char et int de la même manière. Fondamentalement, faites char - '0' pour obtenir la valeur int du 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;
    }
}
0
Farmor

Ceci est le programme complet avec toutes les conditions positives, négatives sans utiliser la bibliothèque

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;
 }
}
0
Anup Gupta

Peut-être que cette voie sera un peu plus rapide:

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;
}
0
Marcin Petrów
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;
}

Résultat: 1) Pour l’entrée "34567", le résultat final serait: 34567 2) Pour l’entrée "-4567", le résultat final serait: -4567 3 ) Pour l’entrée "-", le résultat final serait: Java.lang.NumberFormatException: seulement obtenu - 4) Pour l’entrée "12ab45", le résultat final serait: Java.lang.NumberFormatException: pour la chaîne de saisie 12ab45

0
RAJA VEMULA