string überprüfen ob er eine zahl enthält



  • ich brauche eine fkt., welche mir herausfindet, ob der string, den ich dieser übermittle einen zahl ist
    meine idee hierzu:

    bool Parser::IsDouble(string theString)
    {
        bool isDouble(false);
    
        //check the rest of the string
        for(int i=1; i < theString.length() + 1; i++)
        {
            //the first char can be a '-' so lets check...
            if(i == 1 && theString.length > 1 && theString[i] == '-')
            {
                isDouble = true;
            }
    
            if(theString[i] == '0' || 
                theString[i] == '1' || 
                theString[i] == '2' || 
                theString[i] == '3' || 
                theString[i] == '4' || 
                theString[i] == '5' || 
                theString[i] == '6' || 
                theString[i] == '7' || 
                theString[i] == '8' || 
                theString[i] == '9')
                isDouble = true;
            else if(theString[i] == '.' && isDecimal == false)
            {
                isDecimal = true;
                isDouble = true;
            }
            else
                return false;
        }
    
        return isDouble;
    }
    

    mein problem ist jedoch, das theString[i] nie mit meinen char der if-abfragen übereinstimmt, sprich die if-abfrage springt nicht an, wenn ich z.b. "123.4" übergebe.



  • Habs mir jetzt nicht genau angeschaut, mein Verdacht kann also falsch sein:

    Du überprüfst bis (String.length() + 1). Damit bist du schon hinter deinem eigentlichen String. Dort steht wahrscheinlich als Zeichen ein '\0'. Das passt nicht in deine Abfragen und du bekommst ein false zurück.

    Probier mal bis (String.length() - 1). Um das selber zu überprüfen: Lass dir einfach in jeder Iteration den Character ausgeben, den du testest. Dann wirst du schnell sehen, was da passiert.



  • Hallo

    siehe std::stringstream

    bis bald
    akari



  • Du kannst dir die if-Abfrage sparen, indem du die C-Standard Funktion isdigit() benutzt, die in der ctype Headerdatei liegt.

    mfg.



  • DarthZiu schrieb:

    Habs mir jetzt nicht genau angeschaut, mein Verdacht kann also falsch sein:

    Du überprüfst bis (String.length() + 1). Damit bist du schon hinter deinem eigentlichen String. Dort steht wahrscheinlich als Zeichen ein '\0'. Das passt nicht in deine Abfragen und du bekommst ein false zurück.

    Probier mal bis (String.length() - 1). Um das selber zu überprüfen: Lass dir einfach in jeder Iteration den Character ausgeben, den du testest. Dann wirst du schnell sehen, was da passiert.

    daran liegt es definitiv nicht denn theString.length() liefert mir genau die länge die ich brauche, und da der vs2005 compiler =< nicht wollte habe ich einfach < x + 1 genommen...

    @akari
    wie meinst du das mit std::stringstream



  • - "=<" funktioniert bei meinem gcc genausowenig, denn das Symbol gibt es schlicht und ergreifend nicht. Auf die Idee, dass es "<=" (mnemonic: "kleiner-gleich", ich habe noch nie "gleich-kleiner" gehört) lautet hätte man aber kommen können 😉

    - Du prüfst den String von der zweiten Stelle bis zum Nullbyte (einschliesslich). In der IT üblicherweise bei 0 angefangen zu zählen.

    for (int i=0; i < theString.length(); i++)
    


  • Hallo

    das hier ist der C++ Weg um strings und Zahlen zu konvertieren. Du must dann eben prüfen ob die Konvertierung funktioniert hat oder nicht, so wie hier.

    bis bald
    akari



  • vielen dank, die fkt. scheint nun zu funktionieren. warum ich =<geschrieben habe will ich jetzt gar nicht wissen 🙂


Anmelden zum Antworten