如何确定" Number"数据类型来自任意"字符串"输入

时间:2017-10-27 03:18:23

标签: java string numbers jax-rs integer-arithmetic

我试图对它进行大量搜索,但无法找到具体的解决方案。

我正在开发一个休息服务(使用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吗?

2 个答案:

答案 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。