我试图对它进行大量搜索,但无法找到具体的解决方案。
我正在开发一个休息服务(使用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吗?
答案 0 :(得分:0)
你可能真的不需要检测可能的最小数字类型,只需使用Double
就可以了。如果传入参数恰好是字节大小,它将解析没有任何问题:
Double.parseDouble(str);
但您也可以使用java.text.NumberFormat
来解析任何传入的号码:
Number num = NumberFormat.getInstance().parse(myNumber);
检查所有选项的Numberformat的javadoc。
答案 1 :(得分:0)
使用JAX-RS,您可以强制将此方法与数字匹配。
该方法如下所示:
def FindAPeak(arr, i, j):
mid = (i+j)/2
# if mid element is peak
if (mid == len(arr)-1 or arr[mid] > arr[mid+1]) and (mid == 0 or arr[mid] > arr[mid-1]):
return arr[mid]
# when your peak exists in the right half
if arr[mid] < arr[mid+1] and mid+1 < len(arr):
return FindAPeak(arr, mid+1, j)
# when your peak exists in the left half
else:
return FindAPeak(arr, i, mid-1)
In [31]: arr = [1,2,3,2,1]
...: FindAPeak(arr, 0, len(arr)-1)
...:
Out[31]: 3
In [32]:
...: arr = [1,2,3,4,5,6]
...: FindAPeak(arr, 0, len(arr)-1)
...:
Out[32]: 6
如果数字不符合您的预期,那么客户将会收到@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
。 JAX-RS规范声明所有带有Double
方法的类型都可以在方法参数中使用。由于我们强制使用参数类型,我们可以在这里安全地转换为Double。