2009-09-11 59 views
23

Questa domanda è stata posta di recente e non conosceva la risposta. Da un livello elevato qualcuno può spiegare come Java prende un carattere/stringa e lo converte in un int.In che modo Integer.parseInt (stringa) funziona effettivamente?

Molte grazie

Karl

Edit: sarebbe anche bene sapere se altre lingue fanno un simile genere di cose pure.

+7

Si potrebbe apri 'src.zip' e vedi di persona (per una particolare implementazione). –

+0

Ho aggiornato la risposta con un esempio sulla sottrazione dei codici – rslite

risposta

35

Di solito questo è fatto in questo modo:

  • init risultato con 0
  • per ogni carattere nella stringa fare questo
    • risultato = risultato * 10
    • ottenere la cifra dal carattere ('0' è di 48 ASCII (o 0x30), quindi basta sottrarre che dal codice ASCII per ottenere la cifra)
    • aggiungere la cifra al risultato
  • risultato restituito

Edit: Questo funziona per qualsiasi base se si sostituisce 10 con la base corretta e regolare l'ottenimento della cifra dal carattere corrispondente (dovrebbe funzionare come è per le basi più basse di 10, ma avrebbe bisogno di un po 'di regolazione per basi più alte - come esadecimale - poiché le lettere sono separate da numeri di 7 caratteri).

Edit 2: Char a cifre valore di conversione: caratteri '0' a '9' hanno valori ASCII da 48 a 57 (0x30 a 0x39 in hexa), così al fine di convertire un carattere al suo valore cifre un semplice la sottrazione è necessaria. Di solito si fa in questo modo (dove ord è la funzione che dà il codice ASCII del carattere):

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

Per basi numero superiore le lettere vengono utilizzati come 'cifre' (AF in esa), ma le lettere partono da 65 (esa 0x41) che significa che c'è un gap che dobbiamo spiegare:

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

Esempio: 'B' è 66, così ord ('B') - ord ('0') = 18. da 18 è più grande di 9 sottraiamo 7 e il risultato finale sarà di 11 - il valore della 'cifra' B.

una cosa da notare qui - esimo funziona solo con lettere maiuscole, quindi il numero deve essere prima convertito in maiuscolo.

+0

potresti espandere sul tuo 4 ° punto: Quindi è un caso di sottrarre semplicemente i codici ascii? – Karl

+4

+1 per fornire una buona spiegazione "di alto livello" come richiesto specificamente dal poster (invece del codice sorgente di basso livello). – erickson

+0

Bella, semplice ma grande spiegazione. –

6

Non sono sicuro di quello che stai cercando, come "di alto livello". Ho deciso di dargli una prova:

  • prendere la stringa, analizzare tutti i caratteri uno per uno
  • inizio con un totale di 0
  • se è compreso tra 0 e 9, total = (total x 10) + current
  • quando fatto , il totale è il risultato
24

Il codice sorgente dell'API Java è disponibile gratuitamente.Ecco il metodo parseInt(). È piuttosto lungo perché deve gestire un sacco di casi eccezionali e d'angolo.

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

è ancora sorprendente per me che la gente non guardi solo la fonte. Scaricare il sorgente JDK e collegarlo alla ricerca dell'origine nel tuo IDE dovrebbe essere una delle prime cose che fai quando imposti una nuova workstation ... –

2
  • Trova la lunghezza della stringa (s) (dire maxSize)
  • risultato
  • Inizializza = 0
  • Inizio ciclo (int j = maxSize, i = 0; j> 0; j- -, i ++)
  • int digit = Character.digit (s.charAt (i))
  • risultato = risultato + cifre * (10 potenza j-1)
  • fine ciclo
  • risultato di ritorno
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

questo è il mio semplice implementazione di 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

Ecco cosa mi è venuta (Nota: Non ci sono i controlli vengono effettuati per alfabeti)

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