我具有以下要求:
String = "1.00000"
应该转换为int(因为实际上根本没有分数)String = "1"
应该转换为int 1 String ="1.0001"
应该是一个异常(因为有分数)以前,我假设Integer.valueOf("1.00000")
应该返回一个整数。但是它返回NumberFormatException
。
任何可以解决此问题的Java库,或者至少可以检查1.0000是否实际上是整数,以便我可以安全地解析为Double并将其强制转换为int?
答案 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
}