2009-09-11 6 views
23

On a posé cette question récemment et je ne connaissais pas la réponse. D'un niveau élevé, quelqu'un peut-il expliquer comment Java prend un caractère/String et le convertit en un int?Comment fonctionne Integer.parseInt (chaîne)?

Un grand merci

Karl

Edit: serait également bon de savoir si d'autres langues font une sorte semblable de chose aussi.

+7

Vous pourriez crack 'src.zip' ouvert et voyez par vous-même (pour une implémentation particulière). –

+0

J'ai mis à jour la réponse avec un exemple sur la soustraction des codes – rslite

Répondre

35

Habituellement, cela se fait comme suit:

  • résultent init 0
  • pour chaque caractère dans la chaîne faire
    • résultat = résultat * 10
    • obtenir le chiffre du caractère ('0' est 48 ASCII (ou 0x30), donc il suffit de soustraire cela du code ASCII du caractère pour obtenir le chiffre)
    • ajouter le chiffre au résultat
  • return result

Modifier: Cela fonctionne pour toute base si vous remplacez 10 avec la base correcte et d'ajuster l'obtention du chiffre du caractère correspondant (devrait fonctionner tout comme pour les bases inférieures que 10, mais aurait besoin d'un peu d'ajustement pour les bases plus élevées - comme hexadécimal - puisque les lettres sont séparées des nombres de 7 caractères).

Edit 2: Char à la conversion de la valeur chiffres: caractères '0' à '9' ont des valeurs ASCII 48 à 57 (0x30 à 0x39 en hexa), donc afin de convertir un caractère à sa valeur numérique simple la soustraction est nécessaire. Habituellement, il est fait comme ça (où ord est la fonction qui donne le code ASCII du caractère):

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

Pour des bases plus grand nombre les lettres sont utilisées comme des « chiffres » (AF en hexa), mais les lettres commencent à partir 65 (0x41 hexa) qui signifie qu'il ya une lacune que nous devons tenir compte:

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

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

Encore une chose à noter ici - fonctionne uniquement pour les majuscules, donc le nombre doit d'abord être converti en majuscules.

+0

pourriez-vous développer votre 4ème point: Alors est-ce un cas de soustraction juste des codes ascii? – Karl

+4

+1 pour fournir une bonne explication de "haut niveau" comme l'affiche l'a spécifiquement demandé (au lieu du code source de bas niveau). – erickson

+0

Belle, simple mais bonne explication. –

6

Je ne suis pas sûr de ce que vous cherchez, en tant que "haut niveau". Je vais faire un essai:

  • prendre la chaîne, analyser tous les caractères un par un
  • départ avec un total de 0
  • si elle est comprise entre 0 et 9, total = (total x 10) + current
  • lorsque vous avez terminé , le total est le résultat
24

Le code source de l'API Java est disponible gratuitement.Voici la méthode parseInt(). C'est plutôt long car il faut gérer beaucoup de cas exceptionnels et d'angle.

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

il est toujours surprenant pour moi que les gens ne regardent pas seulement la source. Le téléchargement de la source JDK et sa connexion à la recherche de source dans votre IDE devrait être l'une des premières choses à faire lors de la configuration d'un nouveau poste de travail ... –

2
  • Trouver la longueur de la chaîne (s) (dit maxSize)
  • Initialize result = 0
  • boucle commencer (int j = maxSize, i = 0; j> 0; j- -, i ++)
  • int chiffre = Character.digit (s.charAt (i))
  • result = résultat + * chiffres (10 puissance j-1)
  • boucle d'extrémité
  • résultat retour
6
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); 
    } 

} 
0

ceci est mon implémentation simple 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

Voici ce que je suis venu avec (Remarque: Aucun contrôle ne fait 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; 
    }