public static void main(String[] args) {
String s = "牛奶:89.8元,香肠:12.9元,啤酒:69元,巧克力:132元";
String regex = "[^0123456789.]";
String digitMess = s.replaceAll(regex, " *");
StringTokenizer fenxi = new StringTokenizer(digitMess, "*");//【代码 1】创建 fenxi,用*做分隔标记解析 digitMess 中的单词
int number = 0;//[代码2]fenxi 调用 countTokens()方法返回单词数量 double sum=0;
double sum = 0;
while (fenxi.hasMoreTokens()) {
String str = fenxi.nextToken();//[代码3]fenxi 调用 nextToken()方法返回单词
double temp = 0;
try{
temp = Double.parseDouble(str);
} catch (Exception e) {
continue;
}
sum = sum + temp;
number ++;
}
System.out.println("购物小票中的商品种类:" + number + "种");
System.out.println("购物小票中的价格总额:" + sum + "元");
}
报错是因为 Double.parseDouble(str);把str字符串转成double,当str不是数字时,就转换异常了。
while循环里的字符串变量str有时为空,Double.parseDouble不能转化空字符串。因为你是相当于把非数字当做分隔符,我们来模拟一下StringTokenizer是怎样分割字符串的:首先读取'牛',发现它被当做分隔符,打印分隔符之前的字符串,没有,就输出空字符串;然后读取‘奶’,同理。因此你如果删掉Double.parseDouble语句执行一下代码,你会发现输出的89.8之前有三个空行,那实际上就是输出空字符串
String str = fenxi.nextToken();//[代码3]fenxi 调用 nextToken()方法返回单词
System.out.println(str);
sum = sum + Double.parseDouble(str); // str 返回空,空字符串不能被Double.parse