Java中没有“tryParseDouble”?
可能重复:
如何检查String是java中的数字类型
我看到我可以使用Double.parseDouble
将String
解析为double
。
由于那个可能会抛出一个NumberFormatException
, 并且我不想通过exception进行编程,所以我parseDouble
将parseDouble
调用放入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
而不是0
或NaN
或null
?)。
你总能做一些工厂课
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);