Question Comment Integer.parseInt (string) fonctionne-t-il?


A été posé cette question récemment et ne connaissait pas la réponse. De haut niveau, quelqu'un peut-il expliquer comment Java prend un caractère / String et le convertit en int.

Merci beaucoup

Karl

Edit: serait également bon de savoir si d'autres langues font un genre de chose similaire.


26
2017-09-11 12:24


origine


Réponses:


Habituellement, cela se fait comme ceci:

  • résultat initial avec 0
  • pour chaque caractère en chaîne faites ceci
    • résultat = résultat * 10
    • obtenir le chiffre du caractère ('0' est de 48 ASCII (ou 0x30), alors soustrayez-le simplement du code ASCII du caractère pour obtenir le chiffre)
    • ajouter le chiffre au résultat
  • résultat de retour

modifier: Cela fonctionne pour n'importe quelle base si vous remplacez 10 par la base correcte et ajuste l’obtention du chiffre du caractère correspondant (devrait fonctionner tel quel pour les bases inférieures à 10, mais nécessiterait un petit ajustement pour les bases supérieures - comme hexadécimal) les lettres sont séparées des nombres par 7 caractères).

Modifier 2: Conversion de la valeur de caractère en chiffre: les caractères '0' à '9' ont des valeurs ASCII de 48 à 57 (0x30 à 0x39 dans l'hexa). Une simple soustraction est donc nécessaire pour convertir un caractère en valeur numérique. Habituellement, cela se passe comme ceci (où ord est la fonction qui donne le code ASCII du caractère):

digit = ord(char) - ord('0')

Pour les bases de nombres plus élevées, les lettres sont utilisées comme «chiffres» (A-F dans l'hexa), mais les lettres commencent à 65 (0x41 hexa), ce qui signifie qu'il y a un écart à prendre en compte:

digit = ord(char) - ord('0')
if digit > 9 then digit -= 7

Exemple: 'B' est 66, donc ord ('B') - ord ('0') = 18. Puisque 18 est plus grand que 9, nous soustrayons 7 et le résultat final sera 11 - la valeur du 'chiffre' B .

Une autre chose à noter ici - cela ne fonctionne que pour les lettres majuscules, donc le nombre doit d'abord être converti en majuscule.


38
2017-09-11 12:29



Le code source de l'API Java est disponible gratuitement. Voici la méthode parseInt (). C'est assez long car il doit gérer beaucoup de cas exceptionnels et de coin.

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, max = s.length();
int limit;
int multmin;
int digit;

if (max > 0) {
    if (s.charAt(0) == '-') {
    negative = true;
    limit = Integer.MIN_VALUE;
    i++;
    } else {
    limit = -Integer.MAX_VALUE;
    }
    multmin = limit / radix;
    if (i < max) {
    digit = Character.digit(s.charAt(i++),radix);
    if (digit < 0) {
        throw NumberFormatException.forInputString(s);
    } else {
        result = -digit;
    }
    }
    while (i < max) {
    // 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);
}
if (negative) {
    if (i > 1) {
    return result;
    } else {    /* Only got "-" */
    throw NumberFormatException.forInputString(s);
    }
} else {
    return -result;
}
}

24
2017-09-11 12:39



Je ne suis pas sûr de ce que vous recherchez, en tant que "niveau élevé". Je vais essayer:

  • Prenez la chaîne, analysez tous les caractères un par un
  • commencer avec un total de 0
  • s'il est compris entre 0 et 9, total = (total x 10) + current
  • une fois terminé, le total est le résultat

6
2017-09-11 12:32



public class StringToInt {

    public int ConvertStringToInt(String s) throws NumberFormatException
    {
        int num =0;
        for(int i =0; i<s.length();i++)
        {
            if(((int)s.charAt(i)>=48)&&((int)s.charAt(i)<=59))
            {
                num = num*10+ ((int)s.charAt(i)-48);
            }
            else
            {
                throw new NumberFormatException();
            }

        }
        return num; 
    }

    public static void main(String[]args)
    {
        StringToInt obj = new StringToInt();
        int i = obj.ConvertStringToInt("1234123");
        System.out.println(i);
    }

}

6
2017-11-12 00:55



  • Trouver la longueur de la (des) chaîne (s) (dire maxSize)
  • Initialiser le résultat = 0
  • commencer la boucle (int j = maxSize, i = 0; j> 0; j--, i ++)
  • int digit = Character.digit (s.charAt (i))
  • resultat = resultat + chiffre * (10 puissance j-1)
  • boucle de fin
  • résultat de retour

2
2017-09-11 13:52



c'est ma simple implémentation de parse int

public static int parseInteger(String stringNumber) {
    int sum=0;
    int position=1;
    for (int i = stringNumber.length()-1; i >= 0 ; i--) {
       int number=stringNumber.charAt(i) - '0';
       sum+=number*position;
       position=position*10;

    }
    return sum;
}

0
2017-09-28 20:53



Voici ce que j'ai trouvé (Note: Aucune vérification n'est faite pour les alphabets)

int convertStringtoInt(String number){

    int total =0;
    double multiplier = Math.pow(10, number.length()-1);
        for(int i=0;i<number.length();i++){

            total = total + (int)multiplier*((int)number.charAt(i) -48);
            multiplier/=10;

        }

        return total;
    }

0
2017-11-19 01:28