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.
谢谢
摩根先生.
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);
试试这个:
String sanitizedText = text.replaceAll("[^\\w\\s\\.]", "");
Run Code Online (Sandbox Code Playgroud)
SanitizedText只包含字母数字和空格; 在那之后将它标记为应该是轻而易举的.
编辑
编辑也保留小数点(在括号的末尾)..是regexp的"特殊"所以它需要一个反斜杠逃脱.