有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何从任意“字符串”输入确定“数字”数据类型

我已经试着搜索了很多关于它的信息,但是没有找到一个具体的解决方案

我正在开发一个rest服务(使用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;

}

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

目前,我使用一系列包装器检查类型。解析xxx方法,如下代码所示,但这种方法似乎不正确

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;
    }
}

或者我应该对所有输入使用biginger/BigDecimal吗


共 (2) 个答案

  1. # 1 楼答案

    使用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

  2. # 2 楼答案

    您可能真的不需要检测可能的最小数字类型,只需使用Double就可以了。如果传入参数恰好是字节大小的,它将毫无问题地进行解析:

    Double.parseDouble(str);
    

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

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

    检查Numberformat的javadoc中的所有选项