如何从字符串中获取数字?

Mr *_*gan 5 java string parsing numbers stringtokenizer

我正在使用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(); 
Run Code Online (Sandbox Code Playgroud)

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

谢谢

摩根先生.

Den*_*kiy 8

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;
    }
Run Code Online (Sandbox Code Playgroud)

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


Car*_*icz 5

试试这个:

String sanitizedText = text.replaceAll("[^\\w\\s\\.]", "");
Run Code Online (Sandbox Code Playgroud)

SanitizedText只包含字母数字和空格; 在那之后将它标记为应该是轻而易举的.

编辑

编辑也保留小数点(在括号的末尾)..是regexp的"特殊"所以它需要一个反斜杠逃脱.

  • 我的帽子是@tulskiy,他的解决方案比我的更容易本地化.我正在为他提供更好的解决方案. (2认同)