2010-07-17 6 views
5

J'utilise Java StreamTokenizer pour extraire les différents mots et nombres d'une chaîne, mais j'ai rencontré un problème où les nombres qui incluent des virgules sont concernés, par ex. 10.567 est lu comme 10.0 et, 567.Comment obtenir des nombres en chaîne?

Je dois également supprimer tous les caractères non numériques des numéros où ils peuvent apparaître, par ex. $ 678.00 devrait être 678.00 ou -87 devrait être 87.

Je crois que ceux-ci peuvent être atteints via les méthodes whiteSpace et wordChars mais est-ce que quelqu'un a une idée de comment le faire?

Le code StreamTokenizer de base à l'heure actuelle est la suivante:

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

Ou quelqu'un pourrait suggérer un REGEXP pour y parvenir? Je ne suis pas sûr si REGEXP est utile ici étant donné que tout parding aurait lieu après la lecture des jetons de la chaîne.

Remerciements

Mr Morgan.

+0

Que faut-il à '1,2,3,4'? – polygenelubricants

Répondre

8

StreamTokenizer est pas à jour, est est préférable d'utiliser Scanner, ceci est un exemple de code pour votre problème:

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 vous souhaitez utiliser la virgule comme séparateur à virgule flottante, utilisez fi.useLocale(Locale.FRANCE);

+0

Ceci est extrêmement utile. Et j'ai déjà ajouté quelques autres personnages. Merci beaucoup. –

0

Bien sûr, cela peut être fait avec regexp:

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

remarque cependant qu'il mange toutes les virgules, ce qui est probablement ce que vous voulez si vous utilisez le format de numéro américain où virgule ne sépare des milliers. Dans certaines langues, la virgule est utilisée à la place du point comme séparateur décimal. Soyez donc prudent lors de l'analyse des données internationales.

Je vous laisse le soin de traduire cela en Java.

+0

C'est pourquoi je veux laisser les virgules en place. –

+0

Je pensais que vous aviez besoin du numéro et non de la représentation de la chaîne. nevermind – gorn

5

Essayez ceci:

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

SanitizedText ne contiendra que des caractères alphanumériques et les espaces; Le tokenizing après cela devrait être un jeu d'enfant.

EDIT

Edited pour retenir ainsi le point décimal (à l'extrémité du support). . est "spécial" à regexp donc il a besoin d'un échappement backslash.

+0

Merci. Semble fonctionner mais avec un nombre de £ 345.67, il renvoie 34567.00. –

+1

Facile. Il suffit d'ajouter à l'intérieur des crochets les autres caractères que vous souhaitez conserver. Je vais arranger ça pour vous ... –

+0

Cela pourrait avoir résolu un problème majeur. Et après cette analyse, je peux simplement appeler le StreamTokenizer comme ci-dessus. Merci. –

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

Cela a fonctionné pour moi:

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

Code pour obtenir chiffres de l'exemple string.For i ont chaîne "123", alors je veux numéro 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; 
     } 

Source: How to get number from string

Questions connexes