2009-09-11 19 views
23

Se le hizo esta pregunta recientemente y no sabía la respuesta. Desde un nivel alto alguien puede explicar cómo Java toma un carácter/Cadena y lo convierte en un int.¿Cómo funciona Integer.parseInt (cadena) en realidad?

Muchas gracias

Karl

Editar: también sería bueno saber si otras lenguas hacen una especie similar de algo así.

+7

usted podría crack open 'src.zip' y compruébalo tú mismo (para una implementación en particular). –

+0

He actualizado la respuesta con un ejemplo sobre la resta de códigos – rslite

Respuesta

35

Por lo general, esto se hace así:

  • resultan init con 0
  • para cada carácter en la cadena hacerlo
    • resultado = resultado * 10
    • obtener el dígito del carácter ('0' es 48 ASCII (o 0x30), de modo que restarlo del código ASCII de caracteres para obtener el dígito)
    • agregar el dígito al resultado
  • resultado devuelto

Editar: Esto funciona para cualquier base si se reemplaza 10 con la base correcta y ajustar la obtención del dígito del carácter correspondiente (debería funcionar igual que para las bases inferiores de 10, pero necesitaría un poco de ajuste para bases más altas, como hexadecimal, ya que las letras están separadas de los números por 7 caracteres).

Editar 2: Char a dígitos valor de conversión: caracteres '0' a '9' tienen valores ASCII 48 a 57 (0x30 a 0x39 en hexa), por lo que con el fin de convertir un carácter a su valor dígitos un simple resta es necesaria. Por lo general, se hace del modo siguiente (ord es la función que da el código ASCII del carácter):

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

Para las bases con un número alto de las letras se utilizan como 'cifras' (AF en hexa), pero las cartas se inicia a partir 65 (hexa 0x41) que significa que hay una brecha que tenemos que tener en cuenta:

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

Ejemplo: 'B' es 66, por lo ord ('B') - ord ('0') = 18. Desde 18 es mayor que 9, restamos 7 y el resultado final será 11 - el valor del 'dígito' B.

Una cosa más a tener en cuenta aquí - th funciona solo para letras mayúsculas, por lo que el número se debe convertir primero a mayúsculas.

+0

podría ampliar en su 4º punto: ¿Entonces se trata de restar códigos ascii? – Karl

+4

+1 por proporcionar una buena explicación de "alto nivel" como el cartel solicitó específicamente (en lugar del código fuente de bajo nivel). – erickson

+0

Agradable, simple pero excelente explicación. –

6

No estoy seguro de lo que está buscando, como "alto nivel". Voy a darle una oportunidad:

  • tomar la cadena, analice todos los caracteres de uno en uno
  • comienzo con un total de 0
  • si se encuentra entre 0 y 9, total = (total x 10) + current
  • cuando se hace , el total es el resultado
24

El código fuente de la API de Java está disponible gratuitamente.Aquí está el método parseInt(). Es bastante largo porque tiene que manejar muchos casos excepcionales y de esquina.

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

todavía me sorprende que la gente no solo mire la fuente. Descargar la fuente JDK y conectarla a la búsqueda de origen en su IDE debería ser una de las primeras cosas que hace al configurar una nueva estación de trabajo ... –

2
  • encontrar la longitud de la cadena (s) (decir maxSize)
  • Inicializar resultado = 0
  • comienzan bucle (int j = maxSize, i = 0; j> 0; j- -, i ++)
  • int dígitos = Character.digit (s.charAt (i))
  • resultado = resultado + dígitos * (10 potencia j-1)
  • final del bucle
  • return resultado
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

esta es mi sencilla implementación 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

Esto es lo que se me ocurrió (Nota: No se aceptan cheques se hacen para alfabetos)

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