我正在使用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在这里是否有用,因为在从字符串中读取标记之后会发生任何parding。
由于
摩根先生。答案 0 :(得分: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;
}
如果要将逗号用作浮点分隔符,请使用fi.useLocale(Locale.FRANCE);
答案 1 :(得分:5)
试试这个:
String sanitizedText = text.replaceAll("[^\\w\\s\\.]", "");
SanitizedText只包含字母数字和空格;在那之后将其标记为轻而易举。
修改强>
编辑也保留小数点(在括号的末尾)。 .
对于regexp来说是“特殊的”,所以它需要一个反斜杠转义。
答案 2 :(得分:2)
这对我有用:
String onlyNumericText = text.replaceAll("\\\D", "");
答案 3 :(得分: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()
答案 4 :(得分:0)
当然可以使用regexp来完成:
s/[^\d\.]//g
但请注意,它会占用所有逗号,如果使用美国数字格式,逗号只能分隔数千个,这可能是您想要的。在某些语言中,使用逗号代替点作为小数分隔符。因此在解析国际数据时要小心。
我留给你把它翻译成Java。
答案 5 :(得分:0)
从字符串中获取数字的代码。例如,我有字符串&#34; 123&#34;那么我想编号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;
}