如何解析十进制文本的整数

时间:2019-04-11 05:00:06

标签: java

我具有以下要求:

  1. 输入String = "1.00000"应该转换为int(因为实际上根本没有分数)
  2. 输入String = "1"应该转换为int 1
  3. 但是,输入String ="1.0001"应该是一个异常(因为有分数)

以前,我假设Integer.valueOf("1.00000")应该返回一个整数。但是它返回NumberFormatException

任何可以解决此问题的Java库,或者至少可以检查1.0000是否实际上是整数,以便我可以安全地解析为Double并将其强制转换为int?

3 个答案:

答案 0 :(得分:4)

BigDecimal

Java本身有一个库可以执行以下操作:Custom Domain

示例:

private static int parse(String input) throws ArithmeticException {
    return new BigDecimal(input).intValueExact();
}

如果ArithmeticException对象的分数部分不为零,则BigDecimal方法将引发BigDecimal

答案 1 :(得分:1)

解决问题的一种方法是,可以使用正则表达式首先确保输入与数字格式完全匹配,其中小数部分是可选的,如果全部则为零,如果是,则继续进行解析否则抛出Exception或您想要执行的任何操作。检查此Java代码,

List<String> list = Arrays.asList("1.00000","1","1.0001");
Pattern intPat = Pattern.compile("(\\d+)(\\.0+)?");

list.forEach(x -> {
    Matcher m = intPat.matcher(x);
    if (m.matches()) {
        int num = Integer.parseInt(m.group(1));
        System.out.println(num);
    } else {
        System.out.println(x +" is not a pure Integer"); // Throw exception or whatever you like
    }
});

输出

1
1
1.0001 is not an Integer

此外,只要您使用的数字限制在整数范围内,就可以了,但是为了确保数字不超过整数限制,您可能需要使用其他量词。

您可以使用的另一种更简单的解决方案是,将数字解析为double并将其与int形式进行比较,如果两者相等,则它是一个纯整数,否则就不是。我将比我的第一个使用正则表达式的解决方案更喜欢它。 Java代码,

List<String> list = Arrays.asList("1.00000","1","1.0001");

list.forEach(x -> {
    double num = Double.parseDouble(x);
    if (num == (int)num) {
        System.out.println((int)num);
    } else {
        System.out.println(x + " is not a pure Integer");
    }

打印

1
1
1.0001 is not a pure Integer

答案 2 :(得分:-1)

如果Math.ceil()返回的值不等于Math.ceil(),则可以使用Math.floor()函数,则可以引发异常,否则Math.ceil()/Math.floor()是答案。

int number = Float.parseFloat(input);
if( Math.ceil(number) != Math.floor(number)){
   // throw exception
}else{
   // Math.ceil(input) is your answer
}