0

我必须处理从数据库接收到的数据,其中所有值都是具有许多不同单位的数字

例如

12.553 mg
23floz
5 oz
23kg
45 kg

ETC

要处理这些数据,我必须将所有内容转换为自定义对象Quantity(double amount, String unit)

问题

我不知道数据库中有多少种单位,我需要一种方法来从单位中删除数据的数字部分并将它们分别保存在 2 个临时字符串中,这样之后我就可以处理数据了正确数量对象

这些值并不总是包含将数字与单位分开的空格,因此解决方案如

String[] tmp = line.split("\\s");
Quantity(Double.parse(tmp[0], tmp[1]);

不幸的是不起作用

4

2 回答 2

2

我可能会使用正则表达式匹配来做到这一点。

    String example = "12.564mg";

    Pattern p = Pattern.compile("([0-9.]+)\\s*([a-zA-Z]+)");
    Matcher matcher = p.matcher(example);

    if (matcher.matches()) {
        new Quantity(Double.valueOf(matcher.group(1)), matcher.group(2));
    }
    else {
        throw new IllegalArgumentException("Couldn't parse: " + example);
    }

您可以Pattern为要解析的每个输入项存储并重新使用它。此外,这比拆分更安全一些,因为这matcher.matches()将允许您检查解析是否成功并允许您避免意外的ArrayIndexOutOfBoundsException.

于 2013-09-11T22:23:42.897 回答
1

如何逐行读取数据,在空间上分割每一行并使用每个部分作为Quantity参数?就像是:

String[] tmp = line.split("(?<=\\d)\\s*(?=[a-zA-Z])");
Quantity(Double.parse(tmp[0]), tmp[1]);

这将在具有零个或多个空格的地方拆分


演示:

String[] lines = { "12.553 mg", "23floz", "5 oz", "23kg", "45 kg", };
for (String line : lines) {
    String[] tmp = line.split("(?<=\\d)\\s*(?=[a-zA-Z])");
    System.out.println(tmp[0] + ":" + tmp[1]);
}

输出:

12.553:mg
23:floz
5:oz
23:kg
45:kg
于 2013-09-11T21:46:29.127 回答