1055 Stimmen

Wie prüft man in Java, ob ein String numerisch ist?

Wie würden Sie prüfen, ob ein String eine Zahl ist, bevor Sie ihn parsen?

42 Stimmen

Alle Lösungen, die mit regulären Ausdrücken vorgeschlagen werden, funktionieren nicht für hexadezimale Zahlen.

0 Stimmen

Und die Übergabe einer Null-Zeichenkette in der Funktion matches(...) führt zur Ausnahme NullPointer.

0 Stimmen

In der Antwort von Max Malysh finden Sie eine prägnante Java 8-Lösung ohne Bibliotheken von Drittanbietern.

2voto

OregonGhost Punkte 22841

Deshalb mag ich den Try*-Ansatz in .NET. Zusätzlich zu der traditionellen Parse-Methode, die der Java-Methode entspricht, gibt es auch eine TryParse-Methode. Ich bin nicht gut in der Java-Syntax (out parameters?), also betrachten Sie das Folgende bitte als eine Art Pseudocode. Es sollte das Konzept jedoch klar machen.

boolean parseInteger(String s, out int number)
{
    try {
        number = Integer.parseInt(myString);
        return true;
    } catch(NumberFormatException e) {
        return false;
    }
}

Verwendung:

int num;
if (parseInteger("23", out num)) {
    // Do something with num.
}

0 Stimmen

Yep, es gibt keine "out-Parameter" in Java und da der Integer-Wrapper unveränderlich ist (und somit nicht als gültige Referenz zum Speichern der Ausgabe verwendet werden kann), wäre die vernünftige idiomatische Option die Rückgabe eines Integer-Objekts, das null sein könnte, wenn das Parsen fehlschlägt. Eine hässlichere Option wäre die Übergabe eines int[1] als Ausgabeparameter.

0 Stimmen

Ja, ich erinnere mich an eine Diskussion darüber, warum Java keine Ausgabeparameter hat. aber die Rückgabe eines Integer (als null, wenn nötig) wäre auch in Ordnung, ich denke, obwohl ich nicht über Javas Leistung in Bezug auf Boxing/unboxing wissen.

4 Stimmen

Ich mag C# so sehr wie jeder andere, aber es hat keinen Sinn, einen .NET C# Code-Snippet für eine Java-Frage hinzuzufügen, wenn die Funktionen in Java nicht existieren

2voto

Cenxui Punkte 1250

Sie können NumberUtils.isCreatable() von Apache Commons Lang .

Da NumberUtils.isNumber in 4.0 veraltet sein wird, verwenden Sie stattdessen NumberUtils.isCreatable().

2voto

Noor Nawaz Punkte 2095

Java 8 Stream, Lambda-Ausdruck, funktionale Schnittstelle

Alle bearbeiteten Fälle ( string null, string leer usw. )

String someString = null; // something="", something="123abc", something="123123"

boolean isNumeric = Stream.of(someString)
            .filter(s -> s != null && !s.isEmpty())
            .filter(Pattern.compile("\\D").asPredicate().negate())
            .mapToLong(Long::valueOf)
            .boxed()
            .findAny()
            .isPresent();

2voto

AndyTheEntity Punkte 2376

Ich habe die Lösung von CraigTP so geändert, dass sie auch die wissenschaftliche Notation und sowohl Punkt als auch Komma als Dezimaltrennzeichen akzeptiert

^-?\d+([,\.]\d+)?([eE]-?\d+)?$

Beispiel

var re = new RegExp("^-?\d+([,\.]\d+)?([eE]-?\d+)?$");
re.test("-6546"); // true
re.test("-6546355e-4456"); // true
re.test("-6546.355e-4456"); // true, though debatable
re.test("-6546.35.5e-4456"); // false
re.test("-6546.35.5e-4456.6"); // false

1voto

XForCE07 Punkte 1078

Hier sind zwei Methoden, die funktionieren könnten. (Ohne Verwendung von Ausnahmen). Hinweis: Java ist standardmäßig ein Pass-by-Value-System und der Wert eines Strings ist die Adresse der Objektdaten des Strings. Wenn Sie also Folgendes tun

stringNumber = stringNumber.replaceAll(" ", "");

Sie haben den Eingabewert so geändert, dass er keine Leerzeichen enthält. Sie können diese Zeile entfernen, wenn Sie möchten.

private boolean isValidStringNumber(String stringNumber)
{
    if(stringNumber.isEmpty())
    {
        return false;
    }

    stringNumber = stringNumber.replaceAll(" ", "");

    char [] charNumber = stringNumber.toCharArray();
    for(int i =0 ; i<charNumber.length ;i++)
    {
        if(!Character.isDigit(charNumber[i]))
        {
            return false;
        }
    }
    return true;
}

Hier ist eine weitere Methode, falls Sie Gleitkommazahlen zulassen wollen Diese Methode erlaubt angeblich die Übergabe von Zahlen in der Form 1,123,123,123,123,123.123 Ich habe sie gerade erstellt und denke, sie muss noch weiter getestet werden, um sicherzustellen, dass sie funktioniert.

private boolean isValidStringTrueNumber(String stringNumber)
{
    if(stringNumber.isEmpty())
    {
        return false;
    }

    stringNumber = stringNumber.replaceAll(" ", "");
    int countOfDecimalPoint = 0;
    boolean decimalPointPassed = false;
    boolean commaFound = false;
    int countOfDigitsBeforeDecimalPoint = 0;
    int countOfDigitsAfterDecimalPoint =0 ;
    int commaCounter=0;
    int countOfDigitsBeforeFirstComma = 0;

    char [] charNumber = stringNumber.toCharArray();
    for(int i =0 ; i<charNumber.length ;i++)
    {
        if((commaCounter>3)||(commaCounter<0))
        {
            return false;
        }
        if(!Character.isDigit(charNumber[i]))//Char is not a digit.
        {
            if(charNumber[i]==',')
            {
                if(decimalPointPassed)
                {
                    return false;
                }
                commaFound = true;
                //check that next three chars are only digits.
                commaCounter +=3;
            }
            else if(charNumber[i]=='.')
            {
                decimalPointPassed = true;
                countOfDecimalPoint++;
            }
            else
            {
                return false;
            }
        }
        else //Char is a digit.
        {
            if ((commaCounter>=0)&&(commaFound))
            {
                if(!decimalPointPassed)
                {
                    commaCounter--;
                }
            }

            if(!commaFound)
            {
                countOfDigitsBeforeFirstComma++;
            }

            if(!decimalPointPassed)
            {
                countOfDigitsBeforeDecimalPoint++;
            }
            else
            {
                countOfDigitsAfterDecimalPoint++;
            }
        }
    }
    if((commaFound)&&(countOfDigitsBeforeFirstComma>3))
    {
        return false;
    }
    if(countOfDecimalPoint>1)
    {
        return false;
    }

    if((decimalPointPassed)&&((countOfDigitsBeforeDecimalPoint==0)||(countOfDigitsAfterDecimalPoint==0)))
    {
        return false;
    }
    return true;
}

0 Stimmen

Oh, gute Frage. Ich schätze, das funktioniert nur bei normalen Ganzzahlen. Die Methode wurde ursprünglich erstellt, um eingegebene Telefonnummern zu filtern und Zahlen zu zählen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X