如何从任意 "String" 输入中确定 "Number" 数据类型

How to determine "Number" data type from arbitrary "String" inputs

我已经尝试了很多搜索,但无法得出具体的解决方案。

我正在开发一个休息服务(使用 Jax-RS),它提供了 3 个数字输入,但对于每个输入,实际数据类型在编译时是未知的。例如; "num1" 可以是任何数字,即 int、long、float 或 double 等,类似地 "num2" 和 "num3"。

@GET
@Path("func/{num1}/{num2}/{num3}")
public String function (@PathParam("num1") String num1, @PathParam("num2") String num2, @PathParam("num3") String num3) { 

// Determine the data type of "num1", "num2" and "num3"
// Perform any arithmetic operation on "num1", "num2" and "num3" and return the result;

}

如何确定每个输入的数据类型以执行任何计算?

目前,我使用一系列 Wrapper.parseXXX 方法来检查类型,如下面的代码所示,但这种方法似乎不正确。

private Boolean isByte(String s) {
    try  {
        Byte.parseByte(s);
        return true;

    } catch (NumberFormatException ex) {
        return false;
    }
}
private Boolean isInt(String s) {
    try {
        Integer.parseInt(s);
        return true;

    } catch (NumberFormatException ex) {
        return false;
    }
}
private Boolean isLong(String s) {
    try {
        Long.parseLong(s);
        return true;

    } catch (NumberFormatException ex) {
        return false;
    }
}
private Boolean isStrFloat(String str) {
    try {
        Float.parseFloat(str);
        return true;

    } catch (NumberFormatException ex) {
        return false;
    }
}
private Boolean isStrDouble(String str) {
    try {
        Double.parseDouble(str);
        return true;

    } catch (NumberFormatException ex) {
        return false;
    }
}

还是我应该对所有输入都使用 BigInteger/BigDecimal?

您可能真的不需要检测可能的最小数字类型,只需使用 Double 可能就可以了。如果传入的参数刚好是byte大小,那么解析没有问题:

Double.parseDouble(str);

但您也可以使用java.text.NumberFormat解析任何来电号码:

Number num = NumberFormat.getInstance().parse(myNumber);

检查 Numberformat 的 javadoc 以了解所有选项。

使用 JAX-RS,您可以强制此方法仅匹配数字。

该方法将如下所示:

@GET
@Path("func/{num1: [0-9]+(\.[0-9]+){0,1}}/{num2: [0-9]+(\.[0-9]+){0,1}}/{num3: [0-9]+(\.[0-9]+){0,1}}")
public String function (@PathParam("num1") Double num1, @PathParam("num2") Double num2, @PathParam("num3") Double num3) {
}

如果数字不是您所期望的,那么客户将得到 404 Not Found

请注意我是如何将参数类型设置为 Double 的。 JAX-RS 规范声明所有具有 valueOf(String) 方法的类型都可以在方法参数中使用。由于我们强制参数的类型,我们可以在这里安全地转换为 Double。