Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确定;“数字”;“任意”的数据类型;“字符串”;投入_Java_String_Numbers_Jax Rs_Integer Arithmetic - Fatal编程技术网

Java 如何确定;“数字”;“任意”的数据类型;“字符串”;投入

Java 如何确定;“数字”;“任意”的数据类型;“字符串”;投入,java,string,numbers,jax-rs,integer-arithmetic,Java,String,Numbers,Jax Rs,Integer Arithmetic,我已经试着搜索了很多关于它的信息,但是没有找到一个具体的解决方案 我正在开发一个rest服务(使用Jax-RS),为其提供3个数字输入,但对于每个输入,实际的数据类型在编译时是未知的。例如;“num1”可以是任何数字,即int、long、float或double等,类似于“num2”和“num3” 如何确定每个输入的数据类型以执行任何计算 目前,我使用以下代码中的一系列Wrapper.parseXXX方法检查类型,但这种方法似乎不正确 private Boolean isByte(String

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

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

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

目前,我使用以下代码中的一系列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.parseDouble(str);
但您也可以使用
java.text.NumberFormat
解析任何传入的号码:

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

检查的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) {
}
如果数字不是您所期望的,那么客户端将得到一个
404notfound


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

您应该使用特定的预期数字格式定义API。如果用户偏离了这一点,请准备捕获异常。请记住,除了错误的数字格式之外,还有人可能会传递文本。使用org.apache.commons.lang3.math.NumberUtils.isparsable请阅读-总结是,这不是一种理想的解决志愿者问题的方法,可能会对获得答案产生反作用。请不要将此添加到您的问题中。
@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) {
}