2010-07-17 29 views
5

Estoy usando un Java StreamTokenizer para extraer las diversas palabras y números de una Cadena, pero me he encontrado con un problema donde los números que incluyen comas, p. Ej. 10,567 se lee como 10.0 y, 567.¿Cómo sacar números de la cadena?

También necesito eliminar todos los caracteres no numéricos de los números donde puedan aparecer, p. Ej. $ 678.00 debería ser 678.00 o -87 debería ser 87.

Creo que esto se puede lograr a través de los métodos whiteSpace y wordChars, pero ¿alguien tiene alguna idea de cómo hacerlo?

El código básico StreamTokenizer en la actualidad es:

 BufferedReader br = new BufferedReader(new StringReader(text)); 
     StreamTokenizer st = new StreamTokenizer(br); 
     st.parseNumbers(); 
     st.wordChars(44, 46); // ASCII comma, - , dot. 
     st.wordChars(48, 57); // ASCII 0 - 9. 
     st.wordChars(65, 90); // ASCII upper case A - Z. 
     st.wordChars(97, 122); // ASCII lower case a - z. 
     while (st.nextToken() != StreamTokenizer.TT_EOF) { 
      if (st.ttype == StreamTokenizer.TT_WORD) {      
       System.out.println("String: " + st.sval); 
      } 
      else if (st.ttype == StreamTokenizer.TT_NUMBER) { 
       System.out.println("Number: " + st.nval); 
      } 
     } 
     br.close(); 

O alguien podría sugerir una expresión regular para lograr esto? No estoy seguro de si REGEXP es útil aquí dado que cualquier parding tendría lugar después de que los tokens se leen de la cadena.

Gracias

Mr Morgan.

+0

¿Qué debe suceder a '1,2,3,4'? – polygenelubricants

Respuesta

8

StreamTokenizer no está actualizado, se es mejor utilizar Scanner, esto es código de ejemplo para su problema:

String s = "$23.24 word -123"; 
    Scanner fi = new Scanner(s); 
    //anything other than alphanumberic characters, 
    //comma, dot or negative sign is skipped 
    fi.useDelimiter("[^\\p{Alnum},\\.-]"); 
    while (true) { 
     if (fi.hasNextInt()) 
      System.out.println("Int: " + fi.nextInt()); 
     else if (fi.hasNextDouble()) 
      System.out.println("Double: " + fi.nextDouble()); 
     else if (fi.hasNext()) 
      System.out.println("word: " + fi.next()); 
     else 
      break; 
    } 

Si desea usar una coma como delimitador de coma flotante, utilice fi.useLocale(Locale.FRANCE);

+0

Esto es extremadamente útil. Y ya he agregado algunos otros personajes. Muchas gracias. –

0

Seguro que esto se puede hacer con expresión regular:

s/[^\d\.]//g 

Sin embargo observe que come todos los comas, que es probablemente lo que quiere si se utiliza el formato de número de coma americana donde sólo se está separando miles. En algunos idiomas, se usa coma en lugar del punto como separador decimal. Así que ten cuidado al analizar datos internacionales.

Dejo en usted la tarea de traducir esto a Java.

+0

Es por eso que quiero dejar las comas en su lugar. –

+0

Pensé que necesita el número, no la representación de la cadena. no importa – gorn

5

Prueba esto:

String sanitizedText = text.replaceAll("[^\\w\\s\\.]", ""); 

SanitizedText contendrá sólo caracteres alfanuméricos y espacios en blanco; convertirlo en token después de eso debería ser una brisa.

EDITAR

Edited para retener el punto decimal también (en el extremo del soporte). . es "especial" para regexp, por lo que necesita un escape de barra invertida.

+0

Gracias. Parece que funciona, pero con un número de £ 345.67, devuelve 34567.00. –

+1

Fácil. Solo agrega dentro de los corchetes cualquier otro personaje que quieras conservar. Lo arreglaré por ti ... –

+0

Esto podría haber resuelto un gran problema. Y después de que haya finalizado este análisis, puedo llamar al StreamTokenizer como se indica arriba. Gracias. –

1
String str = "1,222"; 
    StringBuffer sb = new StringBuffer(); 
    for(int i=0; i<str.length(); i++) 
    { 
     if(Character.isDigit(str.charAt(i))) 
      sb.append(str.charAt(i)); 
    } 
    return sb.toString() 
2

Esto funcionó para mí:

String onlyNumericText = text.replaceAll("\\\D", ""); 
0

Código para obtener los números de ejemplo string.For i tienen cadena "123" Entonces quiero al número 123.

int getNumber(String str){ 
      int i=0; 
      int num=0; 
      int zeroAscii = (int)'0'; 
      while (i<str.length()) { 
       int charAscii=(int)str.charAt(i); 
       num=num*10+(charAscii-zeroAscii); 
       i++; 
        } 
      return num; 
     } 

Fuente: How to get number from string

Cuestiones relacionadas