, durch Punkt ersetzten

Abwesend

Grünschnabel
Hiho,

ich bin ein neuling, mehr oder weniger, in C++

Jetzt hab ich mir ein Programm geschrieben welches auch gut funktioniert. Jetzt habe ich es meinen Freunden gegeben und Natürlich haben sie bei der Texteigabe (eines double-Wertes) stat Punkten Kommas eingetipt. Das Programm rechnet falsch und das ist nicht Sinn der Sache!
Jetzt die Frage: gibt es eine Funktion die soetwas überprüft?
Ich habe mir persönlich überlegt das es mit getline() im bezug auf eine Strineingabe gehen müsste, jedoch würde ich gerne wissen ob es einfacher geht?
Wie würdet ihr es machen?

Tobi
 
Das Problem mit dem Komma kannst du lösen, indem du eine lokalisierte Eingabe ausführst, d.h. alle Eingaben (Dezimaltrenner) müssen grundsätzlich mit Komma ausgeführt werden.
C++:
#include <iostream>
#include <locale>

int main()
{
    double dValue; 
    std::cout << "Wert eingeben" << std::endl;
    std::cin.imbue(std::locale("German_germany"));
    std::cin >> dValue;
    
    // ... Irgendwas tun
    
    return 0;
}

Damit ist es aber immer noch möglich, alle möglichen Zeichen einzugeben, die im Ergebnis keine gültigen Zahlen ergeben. Um das abzufangen, ist der Aufwand dann etwas größer, da du die Eingabe erst mal als String einlesen und dann überprüfen musst, ob ungültige Zeichen darin vorkommen:
C++:
#include <iostream>
#include <string>
#include <sstream>
#include <locale>

int main()
{
    std::cout << "Wert eingeben" << std::endl;
    std::string strInput;
    std::cin >> strInput;

    if( strInput.find_first_not_of("01213456789,") != std::string::npos ) // Eingabe prüfen
    {
        std::cout << "Ung\x81ltige Eingabe" << std::endl;
    }
    else
    {
        std::stringstream sstr(strInput);
        sstr.imbue(std::locale("German_germany"));
        double dValue; 
        sstr >> dValue;

        // ... Irgendwas tun
    }

    return 0;
}
Gruß
MCoder
 
Wenn ich da richtig durchsehe gibt er aber nur eine Fehlermeldung raus wenn ein Komma gemacht wurde oder?

Code:
if( strInput.find_first_not_of("01213456789,") != std::string::npos ) // Eingabe prüfen

    {

        std::cout << "Ung\x81ltige Eingabe" << std::endl;

    }

Ich würde es aber leiber ersetzten lasen.
 
Tja da haben wir wohl aneinander vorbeigeredet.

Er soll ja eben "keine" Kommas sondern Punkte erlauben, ich denke das ich dein Code so umbauen kann das es geht aber, wie gesagt, währe es mir lieber eine Lösung zu finden in der dann, fals ein Komma eingegeben wurde, duch einen Punkt ersetzt wird.
 
Kannst du etwa so machen:
C++:
#include <iostream>
#include <sstream>

int main()
{
    std::cout << "Wert eingeben" << std::endl;
    std::string strInput;
    std::cin >> strInput;
    
    // Komma in Punkt wandeln (wenn vorhanden)
    std::string::size_type nPos = strInput.find_first_of(",");
    if( nPos != std::string::npos )
    {
        strInput.replace(nPos, 1, ".");
    }

    // String in double wandeln
    std::stringstream sstr(strInput);
    double dValue; 
    sstr >> dValue;

    return 0;
}
Gruß
MCoder
 
Zurück