使用类NumberFormat
解析时遇到问题,我的数据:
Cocacola 10 50
Tea 10 50
Water 10 50
Milk 10 50
Soda 10 50
我检查了readLine()
并且它读取正确,但是当我解析为double或整数值并打印时,这是错误的,这是stdout:
Cocacola 1.0 5
Tea 1.0 5
Water 1.0 5
Milk 2.0 5
Soda 1.0 5
代码:
String tmp[] = line.split("\\s+");
String name = tmp[0];
double cost=0;
int number=0;
NumberFormat nf = NumberFormat.getInstance();
try {
cost = nf.parse(tmp[1].trim()).doubleValue();
number=nf.parse(tmp[2].trim()).intValue();
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(name+" "+cost+" "+number+" ");
我无法使用普通解析(Double.parse()
,Integer.parse()
等),因为它们会导致NumberFormatException
错误。
答案 0 :(得分:1)
如果您在输入中尝试使用此文件会发生什么?
OnCondition()
可能只是产生错误的空白(和分裂),即:"绿茶","奶茶",...
这条线的分割功能"绿茶10 50"生成Cocacola 10 50
GreenTea 10 50
Water 10 50
MilkTea 10 50
Soda 10 50
并在此代码行中:
tmp["Green","Tea","10","50"]
您正在尝试解析字符串" Tea"。
答案 1 :(得分:1)
您的问题与以下事实有关:您可能在名称中间放置空格,因此使用line.split("\\s+")
无法正常工作,因为您可以获得String
的数组length
更高比3
而代码期望长度恰好为3
。
您应该使用正则表达式来定义行的预期格式,如下所示:
// Meaning a sequence of any characters followed by a space
// then a double followed by a space and finally an integer
Pattern pattern = Pattern.compile("^(.*) (\\d+(?:\\.\\d+)?) (\\d+)$");
Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
String name = matcher.group(1);
double cost = Double.valueOf(matcher.group(2));
int number = Integer.valueOf(matcher.group(3));
System.out.printf("%s %f %d%n", name, cost, number);
} else {
throw new IllegalStateException(
String.format("line '%s' doesn't have the expected format", line)
);
}
答案 2 :(得分:0)
我猜你应该使用2种不同的格式,一种用于数量的另一种格式。你可以试试这个:
NumberFormat nf = NumberFormat.getNumberInstance(Locale.ENGLISH);
try {
cost = nf.parse(tmp[1].trim())).doubleValue();
number = nf.parse(tmp[2].trim()).intValue();
} catch (ParseException e) {
e.printStackTrace();
}
如果您尝试使用此代码:
NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.ENGLISH);
double d = numberFormat.parse("10").doubleValue();
int q = numberFormat.parse("50").intValue();
System.out.println("Cost: " + d);
System.out.println("Quantity: " + q);
输出结果为:
10.0 50
不是您预期的代码吗?