5

Java StreamTokenizer を使用して文字列のさまざまな単語と数字を抽出していますが、コンマを含む数字が関係する問題に遭遇しました。

また、数字以外の文字が発生する可能性がある場合は、数字からすべての文字を削除する必要があります。たとえば、$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 に答える