如何从任意 "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。
我已经尝试了很多搜索,但无法得出具体的解决方案。
我正在开发一个休息服务(使用 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。