2010-02-26 10 views
25

¿Cómo puedo obtener el valor int de una cadena como 423e, es decir, una cadena que contiene un número pero también una letra?Obtener int de String, que también contiene letras, en Java

Integer.parseInt() falla ya que la cadena debe ser un número completo.

+0

no saber nada acerca de Java, sé que podría hacer esto con expresiones regulares. primero borre todos los caracteres que no sean 0-9, luego analice lo que quede. ¿Es ese el tipo de cosa que estás buscando? –

Respuesta

10

A menos que esté hablando de los números base 16 (para los cuales hay un método para analizar como hexadecimal), debe separar explícitamente la parte que le interesa y luego convertirla. Después de todo, ¿cuál sería la semántica de algo así como 23e44e11d en la base 10?

Las expresiones regulares podrían hacer el truco si está seguro de que solo tiene un número. Java tiene un analizador de expresiones regulares incorporado.

Si, por otro lado, su objetivo es concatenar todos los dígitos y volcar los alfas, entonces es bastante sencillo hacerlo iterando carácter por carácter para construir una cadena con StringBuilder, y luego analizar esa.

+0

Gracias, lo hice usando regex. Aunque pensé que podría haber un método incorporado en alguna parte. – DisgruntledGoat

2

Quizás obtenga el tamaño de la cuerda y recorra cada carácter y llame a isDigit() en cada carácter. Si se trata de un dígito, agréguelo a una cadena que solo recopila los números antes de llamar a Integer.parseInt().

Algo así como:

String something = "423e"; 
    int length = something.length(); 
    String result = ""; 
    for (int i = 0; i < length; i++) { 
     Character character = something.charAt(i); 
     if (Character.isDigit(character)) { 
      result += character; 
     } 
    } 
    System.out.println("result is: " + result); 
+3

El algoritmo es correcto, pero debe usar StringBuilder para agregarlo al resultado. –

+3

De acuerdo. Supongo que uno no siempre puede ser perfecto cuando escribe prisa. – digiarnie

+0

Mejor no ser tan apresurado entonces. La concatenación en un ciclo es una de las peores cosas que podrías hacer con las cadenas. Y todavía no está arreglado después de 6 años. – Vlasec

67

Reemplazar todos los no-dígitos con el espacio en blanco: la cadena restante contiene sólo dígitos.

Integer.parseInt(s.replaceAll("[\\D]", "")) 

Esto también eliminará los no dígitos entre medio de los dígitos, por lo que se convierte en "x1x1x"11.

Si tiene que confirmar que la cadena consiste en una secuencia de dígitos (al menos uno), posiblemente seguido de una letra, a continuación, utilizar esto:

s.matches("[\\d]+[A-Za-z]?") 
16

La clase NumberFormat sólo habrá analizar la cadena hasta que llega un carácter no analizable:

((Number)NumberFormat.getInstance().parse("123e")).intValue() 

será, por tanto, volver 123.

+0

También hay [getIntegerInstance()] (https://docs.oracle.com/javase)/7/docs/api/java/text/NumberFormat.html # getIntegerInstance% 28% 29) – mlt

2

Sólo tienes que ir a través de la cadena, la construcción de un int como de costumbre, pero no ignorar número characte RS:

int res = 0; 
for (int i=0; i < str.length(); i++) { 
    char c = s.charAt(i); 
    if (c < '0' || c > '9') continue; 
    res = res * 10 + (c - '0'); 
} 
+0

Bastante seguro que la última línea debería ser 'res = res * 10 + c - '0';' – benkc

+0

@benkc: parece que estás en lo correcto – Claudiu

3

También puede utilizar el escáner:

Scanner s = new Scanner(MyString); 
s.nextInt(); 
+0

no funciona ??? –

+1

La clase [Scanner] (http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html) supone espacios en blanco como el delimitador entre los tokens, pero se puede cambiar a cualquier expresión regular como en 'new Scanner ("456e"). useDelimiter ("\\ D"). nextInt() '. –

Cuestiones relacionadas