Java >> Java Tutorial >  >> Tag >> String

Wie kann man überprüfen, ob eine Zeichenfolge in ein Double geparst werden kann?

Apache hat wie üblich eine gute Antwort von Apache Commons-Lang in Form von NumberUtils.isCreatable(String) .

Verarbeitet null s, kein try /catch Sperre erforderlich.


Du kannst Double.parseDouble() immer in einen try-catch-Block packen.

try
{
  Double.parseDouble(number);
}
catch(NumberFormatException e)
{
  //not a double
}

Der übliche Ansatz wäre, dies mit einem regulären Ausdruck zu überprüfen, wie er auch in Double.valueOf(String) vorgeschlagen wird Dokumentation.

Der dort bereitgestellte (oder unten eingefügte) reguläre Ausdruck sollte alle gültigen Gleitkommafälle abdecken, sodass Sie nicht damit herumspielen müssen, da Sie schließlich einige der Feinheiten verpassen werden.

Wenn Sie das nicht möchten, try catch ist immer noch eine Option.

Der vom JavaDoc vorgeschlagene reguläre Ausdruck ist unten enthalten:

final String Digits     = "(\\p{Digit}+)";
final String HexDigits  = "(\\p{XDigit}+)";
// an exponent is 'e' or 'E' followed by an optionally 
// signed decimal integer.
final String Exp        = "[eE][+-]?"+Digits;
final String fpRegex    =
    ("[\\x00-\\x20]*"+ // Optional leading "whitespace"
    "[+-]?(" +         // Optional sign character
    "NaN|" +           // "NaN" string
    "Infinity|" +      // "Infinity" string

    // A decimal floating-point string representing a finite positive
    // number without a leading sign has at most five basic pieces:
    // Digits . Digits ExponentPart FloatTypeSuffix
    // 
    // Since this method allows integer-only strings as input
    // in addition to strings of floating-point literals, the
    // two sub-patterns below are simplifications of the grammar
    // productions from the Java Language Specification, 2nd 
    // edition, section 3.10.2.

    // Digits ._opt Digits_opt ExponentPart_opt FloatTypeSuffix_opt
    "((("+Digits+"(\\.)?("+Digits+"?)("+Exp+")?)|"+

    // . Digits ExponentPart_opt FloatTypeSuffix_opt
    "(\\.("+Digits+")("+Exp+")?)|"+

    // Hexadecimal strings
    "((" +
    // 0[xX] HexDigits ._opt BinaryExponent FloatTypeSuffix_opt
    "(0[xX]" + HexDigits + "(\\.)?)|" +

    // 0[xX] HexDigits_opt . HexDigits BinaryExponent FloatTypeSuffix_opt
    "(0[xX]" + HexDigits + "?(\\.)" + HexDigits + ")" +

    ")[pP][+-]?" + Digits + "))" +
    "[fFdD]?))" +
    "[\\x00-\\x20]*");// Optional trailing "whitespace"

if (Pattern.matches(fpRegex, myString)){
    Double.valueOf(myString); // Will not throw NumberFormatException
} else {
    // Perform suitable alternative action
}

Java-Tag