有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何从字符串中提取数字?

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

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

我相信这些都可以通过空格和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在这里是否有用,因为从字符串中读取令牌后会发生任何损坏

谢谢

摩根先生


共 (6) 个答案

  1. # 1 楼答案

    确保可以使用regexp执行此操作:

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

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

    我让你自己把它翻译成Java

  2. # 2 楼答案

    这对我很有用:

    String onlyNumericText = text.replaceAll("\\\D", "");
    
  3. # 3 楼答案

    用于从字符串获取数字的代码。例如,我有字符串“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;
            }
    

    资料来源:How to get number from string

  4. # 4 楼答案

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

  5. # 5 楼答案

        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()
    
  6. # 6 楼答案

    试试这个:

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

    净化文本将只包含字母数字和空格;在那之后将其标记化应该是轻而易举的事

    编辑

    编辑以保留小数点(在括号的末尾).对于regexp来说是“特殊的”,因此它需要反斜杠转义