2010-07-17 23 views
5

Ich verwende einen Java StreamTokenizer, um die verschiedenen Wörter und Zahlen eines Strings zu extrahieren, habe aber ein Problem mit Zahlen, die Kommas enthalten, z. 10.567 wird als 10.0 und 567 gelesen.Wie bekomme ich Zahlen aus der Zeichenfolge?

Ich muss auch alle nicht numerischen Zeichen von den Nummern entfernen, wo sie auftreten könnten, z. $ 678.00 sollte 678.00 sein oder -87 sollte 87.

Ich glaube, dass diese über die WhiteSpace und WordChars Methoden erreicht werden können, aber hat jemand eine Idee, wie es geht?

Der Grund derzeit StreamTokenizer Code ist:

 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(); 

Oder jemand eine REGEXP dies zu erreichen, könnte vermuten lassen? Ich bin mir nicht sicher, ob REGEXP hier nützlich ist, da jedes Parding stattfinden würde, nachdem die Token aus der Zeichenfolge gelesen wurden.

Danke

Herr Morgan.

+0

Was '1,2,3,4' passieren sollte? – polygenelubricants

Antwort

8

StreamTokenizer ist veraltet, ist besser Scanner zu verwenden, ist dies Beispielcode für Ihr Problem:

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

Wenn Sie Komma als Floating-Point-Trennzeichen verwenden möchten, verwenden Sie fi.useLocale(Locale.FRANCE);

+0

Dies ist sehr hilfreich. Und ich habe bereits ein paar andere Charaktere hinzugefügt. Danke vielmals. –

0

Sicher kann dies mit regexp erfolgen:

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

jedoch feststellen, dass es alle Kommata isst, was wahrscheinlich ist, was Sie wollen, wenn amerikanisches Zahlenformat mit dem Komma nur Tausende Trennen. In einigen Sprachen wird Komma anstelle des Punktes als Dezimaltrennzeichen verwendet. Seien Sie also vorsichtig, wenn Sie internationale Daten analysieren.

Ich überlasse es Ihnen, dies in Java zu übersetzen.

+0

Deshalb möchte ich die Kommas an Ort und Stelle lassen. –

+0

Ich dachte, Sie brauchen die Nummer nicht die String-Darstellung davon. vergiss – gorn

5

Versuchen Sie folgendes:

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

SanitizedText nur alphanumerische Zeichen und Leerzeichen enthalten wird; es danach zu symbolisieren sollte ein Kinderspiel sein.

EDIT

Edited als auch das Dezimalkomma zu halten (am Ende der Halterung). . ist "speziell" zu regexp, so dass es einen Backslash-Escape benötigt.

+0

Danke. Scheint zu arbeiten, aber mit einer Anzahl von £ 345,67, gibt es 34567,00 zurück. –

+1

Einfach. Fügen Sie einfach weitere Zeichen in die Klammern ein, die Sie behalten möchten. Ich werde das für Sie reparieren ... –

+0

Dies hätte vielleicht ein großes Problem gelöst. Und nachdem dieses Parsing fertig ist, kann ich den StreamTokenizer wie oben beschrieben aufrufen. Vielen Dank. –

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

Dies funktionierte für mich:

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

Code für erhalten Zahlen von string.For Beispiel Zeichenfolge "123" i will ich 123 dann an die Nummer

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

Quelle: How to get number from string

Verwandte Themen