Java中没有“tryParseDouble”?

可能重复:
如何检查String是java中的数字类型

我看到我可以使用Double.parseDoubleString解析为double

由于那个可能会抛出一个NumberFormatException并且我不想通过exception进行编程,所以我parseDoubleparseDouble调用放入try / catch块中,以检查字符串是否可以解析为double

在Delphi中,有TryParseInt (我认为),如果字符串无法解析为Integer ,则返回一个定义的值(我认为是-1)。

在Java中没有类似的东西? 我的意思是:没有标准的方法可以做到这一点?

你遇到的问题是你有两种可能的结果。 要么你有一个有效的双倍,要么你没有。 如果您有返回值,则需要检查是否可能忘记检查,或者您检查每个值。

 try { double d = Double.parseDouble(input); double d2 = Double.parseDouble(input2); double d3 = Double.parseDouble(input3); double d4 = Double.parseDouble(input4); // all number are good. } catch (NumberFormatException e) { e.printStackTrace(); //prints error } 

要么

 double d, d2, d3, d4; if (tryParseDouble(input)) { d = parseDouble(input); if (tryParseDouble(input2)) { d2 = parseDouble(input2); if (tryParseDouble(input3)) { d3 = parseDouble(input3); } else { if (tryParseDouble(input4)) { d4 = parseDouble(input4); } else { System.out.println("Cannot parse " + input4); } System.out.println("Cannot parse " + input3); } } else { System.out.println("Cannot parse " + input2); } } else { System.out.println("Cannot parse " + input); } 

执行此操作的标准方法是:

 double d; try { d = Double.parseDouble(input); } catch (NumberFormatException e) { // Use whatever default you like d = -1.0; } 

如果您愿意,这当然可以作为库方法包装。

总的来说,我不会错过这不是语言的一部分 – 如果一个字符串形成错误,它不代表 -1所以正确的做法是抛出exception。 如果你想将它视为-1你可以自由地这样做,但是制定这个标准库行为的理由很简单(为什么-1而不是0NaNnull ?)。

你总能做一些工厂课

 class DoubleFactory{ public static double tryParseDouble(final String number){ double result; try { result = Double.parseDouble(number); } catch (NumberFormatException e) { result = 0.0; } return result; } } 

但是这有很大的问题。 您的程序将继续正常流程,但您的某些模型类将被“破坏”。 在其他一些操作之后,这个“默认”值将弹出,并打破其他,以及其他。 最糟糕的是,你不会看到导致这些破碎结果的exception。 至少你可以

 catch (NumberFormatException e) { //add exception logging here, something like logger.info(e.getMessage()); result = 0.0; } 

但结果将是相同的 – 使用默认0.0(或-1.0或其他)值的操作导致某些不可恢复的状态。

作为已提供的解决方案的替代方案,您可以使用正则表达式:

 Pattern doublePattern = Pattern.compile("^\d*$"); Matcher matchesDouble = doublePattern.matcher(myString); boolean isDouble = matchesDouble.matches(); 

要么:

 boolean isDouble = Pattern.matches("^\d*$", myString);