Java中没有“tryParseDouble”?

No “tryParseDouble” in Java?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How to check a String is a numeric type in java

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

因为可能会抛出一个NumberFormatException,而我不想异常地进行编程,所以我犹豫是否将parseDouble调用放入try/catch块,以检查字符串是否可以被解析为double

在Delphi中,有EDOCX1(我认为是8),如果字符串不能解析为Integer,它将返回一个定义值(我认为是1)。

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


这样做的标准方法是:

1
2
3
4
5
6
7
8
double d;
try {
    d = Double.parseDouble(input);
}
catch (NumberFormatException e) {
    // Use whatever default you like
    d = -1.0;
}

如果您愿意的话,这当然可以被包装成一种库方法。

总的来说,我不认为这不是语言的一部分——如果字符串的格式不正确,它不代表-1,所以正确的做法是抛出一个异常。如果你想将其视为-1,你可以这样做,但这种标准库行为的理由非常薄弱(为什么-1,而不是0NaNnull?.


问题是你有两个可能的结果。或者您有一个有效的double,或者您没有。如果您有一个返回值,您需要检查,您可能会忘记检查,或者您有一个if检查每个值。

1
2
3
4
5
6
7
8
9
10
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
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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);
}


你总是可以上一些工厂的课

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class DoubleFactory{

public static double tryParseDouble(final String number){

double result;
try {
    result = Double.parseDouble(number);
}
catch (NumberFormatException e) {
    result = 0.0;
}
return result;
}
}

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

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

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


作为已经提供的解决方案的替代方案,您可以使用regex:

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

或:

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