2010-07-17 16 views
5

Utilizzo un Java StreamTokenizer per estrarre le varie parole e numeri di una stringa ma ho incontrato un problema in cui sono interessati numeri che includono virgole, ad es. 10.567 viene letto come 10.0 e, 567.Come ottenere numeri fuori stringa?

Devo anche rimuovere tutti i caratteri non numerici dai numeri in cui potrebbero verificarsi, ad es. $ 678,00 dovrebbe essere 678,00 o -87 dovrebbe essere 87.

Credo che questi possano essere raggiunti tramite i metodi whiteSpace e wordChars ma qualcuno ha qualche idea su come farlo?

Il codice di base StreamTokenizer al momento è:

 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 qualcuno potrebbe suggerire un REGEXP per raggiungere questo obiettivo? Non sono sicuro che REGEXP sia utile qui dato che qualsiasi parding avverrebbe dopo che i token sono stati letti dalla stringa.

Grazie

Signor Morgan.

+0

Cosa dovrebbe accadere a '1,2,3,4'? – polygenelubricants

risposta

8

StreamTokenizer è obsoleto, si è meglio usare Scanner, questo è il codice di esempio per il vostro 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; 
    } 

Se si desidera utilizzare una virgola come delimitatore virgola mobile, utilizzare fi.useLocale(Locale.FRANCE);

+0

Ciò è estremamente utile. E ho già aggiunto alcuni altri personaggi. Grazie molto. –

0

sicuro che questo può essere fatto con regexp:

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

Tuttavia notare che si mangia tutte le virgole, che è probabilmente quello che vuoi se utilizzando il formato numero americano dove virgola è solo separando migliaia. In alcune lingue viene utilizzata una virgola al posto del punto come separatore decimale. Quindi fai attenzione quando analizzi i dati internazionali.

Lascio a voi di tradurre questo in Java.

+0

Ecco perché voglio lasciare le virgole sul posto. –

+0

Ho pensato che fosse necessario il numero non la sua rappresentazione in stringa. Nevermind – gorn

5

Prova questo:

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

SanitizedText conterrà solo caratteri alfanumerici e spazi; renderlo tokenizing dopo quello dovrebbe essere un gioco da ragazzi.

EDIT

cura di mantenere il punto decimale pure (alla fine della staffa). . è "speciale" per regexp quindi è necessario un escape backslash.

+0

Grazie. Sembra funzionare ma con un numero di £ 345,67, restituisce 34567,00. –

+1

Facile. Aggiungi all'interno delle parentesi qualsiasi altro personaggio che desideri conservare. Lo aggiusterò per te ... –

+0

Questo potrebbe aver risolto un grosso problema. E dopo questo parsing, posso semplicemente chiamare lo StreamTokenizer come sopra. Grazie. –

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

Questo ha funzionato per me:

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

Codice per ottenere numeri da string.For esempio ho stringa "123" allora voglio al numero 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; 
     } 

Fonte: How to get number from string

Problemi correlati