Ein kleines Rechenprogramm - Zahleneinlesungs Probleme



  • Hi,
    ich habe seit kurzem angefangen zu programmieren und sitze gerade
    an einem eigentlich ganz simplen Programm mit UI,
    das eigentlich auch schon fertig ist, jedoch jetzt noch etwas verschönert
    werden soll.
    Die einzigen Funktionen des Programmes sind, Zahlen einzugeben und sie per
    Knopfdruck umrechnen zu lassen.
    Da ich mein Programm variabler machen wollte,
    würde ich gerne die möglichen Eingaben verbessern.
    Im Moment hab ich mit einem Filter nur BS;',';Zahlen erlaubt,
    da der '.' nicht zum trenne von Zahlen anerkannt wird...

    ich würde gerne möglich machen das mit die Zahlen sowohl mit dem
    ',' als auch mit dem '.' trennen kann.

    Beispiel:
    Eingabe: 1,32 => wird als 1,32 gespeichert
    Eingabe: 1.32 => wird als 132 gespeichert

    versteht ihr mein Problem ?

    ich wusste nicht wonach ich suchen soll,
    daher konnte ich über Google keine Lösung finden 😢


  • Mod

    hihohohi schrieb:

    versteht ihr mein Problem ?

    Ehrlich gesagt: Nein. Kannst du ein paar mehr Beispiele bringen? Was geht rein und was soll raus kommen? Und dabei deutlicher unterscheiden, was wie getrennt ist? Spielen hier Dezimaltrennzeichen eine Rolle(bin mir bei deiner Beschreibung nicht so sicher)?

    Im Moment hab ich mit einem Filter nur BS;',';Zahlen erlaubt,

    Wie hast du das denn gemacht? Irgendwie traue ich einem Anfänger keinen eigenen Streambuf-Filter zu, also wirst du das wohl irgendwie anders gemacht haben.



  • Vielleicht sowas hier (geklaut von StackOverflow):

    void replaceAll( string &s, const string &search, const string &replace ) {
        for( size_t pos = 0; ; pos += replace.length() ) {
            // Locate the substring to replace
            pos = s.find( search, pos );
            if( pos == string::npos ) break;
            // Replace by erasing and inserting
            s.erase( pos, search.length() );
            s.insert( pos, replace );
        }
    }
    
    string input = getFromGui();
    replaceAll(input, ".", ","); //geht auch effizienter, aber naja
    //benutze input wie gehabt
    


  • Also ich arbeite mit Windows Forms,
    habe glaube ich einen Reggex Filter verwendet.
    (Da ich durch die grobe Suche im Internet nur schlechte ausführungen,
    oder für mich unverständliche Ausführungen von Filtern gefunden habe,
    hatte ich einen Freund der C# programmieren gefragt, und er meinte halt google Reggex)

    Mit meiner Anpassung sieht der dann so aus:

    private: System::Void textBox7_KeyPress(System::Object^  sender, System::Windows::Forms::KeyPressEventArgs^  e) {
    			 if(!Char::IsDigit(e->KeyChar) && e->KeyChar != 0x08 && e->KeyChar != 0x2C && e->KeyChar != 0x2E)
    				e->Handled = true;
    

    Zu meinem Problem, dass wenn ich die Zahl "12.3" eingebe,
    sie auch als 12,3 gespeichert wird. Dies ist mir im Moment jedoch nur
    Möglich wenn ich die Zahl mit Komma eingebe, also "12,3",
    da er den '.' als in normales Zeichen ansieht und die Zahl "12.3" als 123 abspeichert.



  • nwp3 schrieb:

    Vielleicht sowas hier (geklaut von StackOverflow):

    void replaceAll( string &s, const string &search, const string &replace ) {
        for( size_t pos = 0; ; pos += replace.length() ) {
            // Locate the substring to replace
            pos = s.find( search, pos );
            if( pos == string::npos ) break;
            // Replace by erasing and inserting
            s.erase( pos, search.length() );
            s.insert( pos, replace );
        }
    }
    
    string input = getFromGui();
    replaceAll(input, ".", ","); //geht auch effizienter, aber naja
    //benutze input wie gehabt
    

    sind das jetzt 2 verschiedene Lösungswege ?
    verdammt ok habs gerafft.
    werde es mal testen



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Sieht so aus, als würdest du nicht C++, sondern C++/CLI machen. Ich verschiebe dich mal. Da gibt es sicherlich Möglichkeiten, direkt an der Quelle anzusetzen, anstatt die Eingabe nach zu behandeln.



  • ich behandle die Quelle meiner Meinung nach schon direkt,
    da ich das halt doch direkt am "Keypress" event mache, oder nicht ?
    Die Lösung

    void replaceAll( string &s, const string &search, const string &replace ) {
    for( size_t pos = 0; ; pos += replace.length() ) {
    // Locate the substring to replace
    pos = s.find( search, pos );
    if( pos == string::npos ) break;
    // Replace by erasing and inserting
    s.erase( pos, search.length() );
    s.insert( pos, replace );
    }
    }

    string input = getFromGui();
    replaceAll(input, ".", ","); //geht auch effizienter, aber naja
    //benutze input wie gehabt

    krieg ich leider nicht ganz hin 😢
    Da er mir das String nicht erlauben will,
    eigentlich soltle doch std::string gehen oder nicht ?



  • private: System::Void textBox1_KeyPress(System::Object^  sender, System::Windows::Forms::KeyPressEventArgs^  e) {
    			 if(!Char::IsDigit(e->KeyChar) && e->KeyChar != 0x08 && e->KeyChar != 0x2C && e->KeyChar != 0x2E)
    				e->Handled = true;
    			 string input = System::Convert::ToString(textBox6->Text);
    			 replaceAll(input, ".", ",");
    		 }
    

    Leider gibt er mir nur eine Fehlermeldung, da er den inhalt der textBox6 nicht
    in einen String umwandeln kann...



  • Wenn ich das auf dieses hier änder hat er plötzlich unzählbar viele Fehler in "xtgmath.h":

    private: System::Void textBox1_KeyPress(System::Object^  sender, System::Windows::Forms::KeyPressEventArgs^  e) {
    			 if(!Char::IsDigit(e->KeyChar) && e->KeyChar != 0x08 && e->KeyChar != 0x2C && e->KeyChar != 0x2E)
    				e->Handled = true;
    			 string input = (textBox6->ToString);
    			 replaceAll(input, ".", ",");
    

Log in to reply