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