NumberFormat Java解析错误

时间:2016-11-25 15:04:46

标签: java

使用类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错误。

3 个答案:

答案 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

不是您预期的代码吗?