web-dev-qa-db-fra.com

Comment fonctionne Integer.parseInt (chaîne)?

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

Merci beaucoup

Karl

Edit: Il serait également bon de savoir si d’autres langues font le même genre de chose.

27
Karl

Cela se fait généralement comme ceci:

  • résultat init avec 0
  • faites ceci pour chaque caractère de la chaîne
    • résultat = résultat * 10
    • obtenir le chiffre du caractère ('0' est égal à 48 ASCII (ou 0x30), il suffit donc de le soustraire du code du caractère ASCII pour obtenir le chiffre)
    • ajouter le chiffre au résultat
  • résultat retourné

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

Édition 2 : Conversion de valeur de caractère à chiffre: les caractères '0' à '9' ont ASCII entre 48 et 57 (0x30 à 0x39 en hexa), afin de convertir un caractère en valeur numérique une simple soustraction est nécessaire. Cela se fait généralement 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 des «chiffres» (A à F en hexa), mais les lettres commencent à partir de 65 (0x41 hexa), ce qui signifie qu'il y a un espace que nous devons prendre en compte:

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

Exemple: 'B' vaut 66, donc ord ('B') - ord ('0') = 18. Comme 18 est supérieur à 9, nous soustrayons 7 et le résultat final sera 11 - la valeur du 'chiffre' B .

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

41
rslite

Le code source de l'API Java est disponible gratuitement. Voici la méthode parseInt (). Il est plutôt long car il doit gérer de nombreux cas exceptionnels et dans les virages.

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;
}
}
25
Michael Borgwardt

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

  • prendre la ficelle, analyser tous les personnages un par un
  • commence avec un total de 0
  • si elle est comprise entre 0 et 9, total = (total x 10) + current
  • une fois terminé, le total est le résultat
7
KLE
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
javaMan

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;
}
1
Basheer AL-MOMANI

Voici ce que je suis venu avec (Remarque: 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
Shishir Shetty