5

我正在使用 Java StreamTokenizer 来提取字符串的各种单词和数字,但遇到了一个问题,其中涉及包含逗号的数字,例如 10,567 被读取为 10.0 和 ,567。

我还需要从可能出现的数字中删除所有非数字字符,例如 $678.00 应该是 678.00 或 -87 应该是 87。

我相信这些可以通过 whiteSpace 和 wordChars 方法来实现,但有人知道怎么做吗?

目前基本的streamTokenizer代码是:

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

或者有人可以建议使用 REGEXP 来实现这一目标吗?我不确定 REGEXP 在这里是否有用,因为在从字符串中读取标记后会发生任何处理。

谢谢

摩根先生。

4

6 回答 6

9

StreamTokenizer 已过时,最好使用Scanner,这是您问题的示例代码:

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

如果要将逗号用作浮点分隔符,请使用fi.useLocale(Locale.FRANCE);

于 2010-07-17T18:49:12.270 回答
5

试试这个:

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

SanitizedText 将仅包含字母数字和空格;之后对其进行标记应该是轻而易举的事。

编辑

编辑以保留小数点(在括号的末尾)。.对正则表达式来说是“特殊的”,所以它需要一个反斜杠转义。

于 2010-07-17T17:51:39.903 回答
4

这对我有用:

String onlyNumericText = text.replaceAll("\\\D", "");
于 2012-12-20T08:49:49.437 回答
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()
于 2010-08-06T15:40:40.683 回答
0

当然这可以用正则表达式完成:

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

但是请注意,它会吃掉所有逗号,如果使用逗号仅分隔数千的美国数字格式,这可能是您想要的。在某些语言中,使用逗号代替小数点作为小数分隔符。所以在解析国际数据时要小心。

我让你把它翻译成Java。

于 2010-07-17T17:49:10.440 回答
0

从字符串中获取数字的代码。例如,我有字符串“123”,然后我想要数字 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;
        }

资料来源:如何从字符串中获取数字

于 2015-11-26T19:52:03.697 回答