Float mit Komma



  • Hallo,

    ich stehe vor einem kleinen Problem. Ich wandle einen String in einen Float um. Klappt auch super, nur hat dieser Float einen Punkt statts ein Komma.

    10.98 zum Beispiel.

    Ich möchte aber 10,98 .

    Warum es Punkt ist ist mir klar, aber wie kann ich ein Komma an der besagten Stelle bekommen. Ich könnte zwar immer den Float durchsuchen und Punkt durch Komma tauschen, aber es gibt ja sicherlich eine bessere Möglichkeit dazu, oder?

    Weiß jemand Rat?

    Danke. 🙂

    Grüße
    Chris



  • Hä? Ein Float hat überhaupt kein Komma. Nur Ausgabe und Formatierungsfunktionen setzen halt an der richtigen Stelle nen Punkt.
    Nur wenn du nen Float in nen String umwandelst hättest du einen Punkt...



  • interpreter schrieb:

    Hä? Ein Float hat überhaupt kein Komma. Nur Ausgabe und Formatierungsfunktionen setzen halt an der richtigen Stelle nen Punkt.
    Nur wenn du nen Float in nen String umwandelst hättest du einen Punkt...

    Schreibt er doch das er genau das tut!

    @chris
    Wühl dich mal durch www.cplusplus.com/ref. Dort findest du Funktionen
    für alle Gelegenheiten, auch in Zukunft 😉



  • Taurin schrieb:

    interpreter schrieb:

    Hä? Ein Float hat überhaupt kein Komma. Nur Ausgabe und Formatierungsfunktionen setzen halt an der richtigen Stelle nen Punkt.
    Nur wenn du nen Float in nen String umwandelst hättest du einen Punkt...

    Schreibt er doch das er genau das tut!

    chris_davidi schrieb:

    Ich wandle einen String in einen Float um



  • chris_davidi schrieb:

    ich stehe vor einem kleinen Problem. Ich wandle einen String in einen Float um. Klappt auch super, nur hat dieser Float einen Punkt statts ein Komma.

    10.98 zum Beispiel.

    Ich möchte aber 10,98 .

    Imho gibts da eine diskrepanz in deiner Aussage. Du willst einen String in einen float umwandeln, andererseits willst du Kommaschreibweise im String. Darf man fragen, wieso? Wenn du ihn umwandelst, dann kanns dir egal sein, ob es ein Punkt ist oder nicht. ab dem Punkt trennst du und ab dann ist es der Kommaanteil.
    Oder meintest du float in string?



  • Also ein Teil des Codes ist dies:

    memcpy(avp, (buffer + 54), 6); /* kopiere AVP in buffer */
       asfloat = atof(avp); /* kovertiere AVP in buffer */
       fprintf(newgum, "%.2f", asfloat/100); /* formatieren und ausgeben */
       fputs(";", newgum);
    

    Also ich kopiere Mittels memcpy von einem String (buffer) einen Teil und schreibe es in die Variable AVP. Dies sieht dann so aus:

    002458

    Daraus wird dann 24.58 , wenn ich es mit fprintf in meinen Stream (die Datei newgum) schreibe. Das möchte ich aber nicht. Ich möchte das ich meiner Datei 24,58 steht, also mit Komma. Gibt es dafür eine gute Möglichkeit oder hat sogar jemand Code und kann es mir an meinem Beispiel zeigen?

    Sorry, habe mich bei meinen letzten Posts eventuell falsch ausgedrückt, aber nun sollte es klar sein.

    Danke für die Hilfe,
    Chris



  • dann schreibe diesen string (bzw. die Kommazahl im string) in einen anderen String und parse den punkt zu einem komma, und schreib danach in die Datei. Das ist doch trivial, wo ist das Problem?



  • sollte man hierfür nicht setlocale nutzen? Ich hab die Funktion noch nie genutz aber ein Blick in den Header förder dies zu Tage:
    [cpp]struct lconv {
    char *currency_symbol;
    *char decimal_point;
    char *grouping;
    char *int_curr_symbol;
    char *mon_decimal_point;
    char *mon_grouping;
    char *mon_thousands_sep;
    char *negative_sign;
    char *positive_sign;
    char *thousands_sep;
    char frac_digits;
    char int_frac_digits;
    char n_cs_precedes;
    char n_sep_by_space;
    char n_sign_posn;
    char p_cs_precedes;
    char p_sep_by_space;
    char p_sign_posn;
    };

    struct lconv * localeconv(void);
    char * setlocale(int _category, const char *_locale);[/cpp]
    Und wenn ich mich recht errinere ist das sogar Standard, oder?



  • *** schrieb:

    sollte man hierfür nicht setlocale nutzen? Ich hab die Funktion noch nie genutz aber ein Blick in den Header förder dies zu Tage:
    [cpp]struct lconv {
    char *currency_symbol;
    *char decimal_point;
    char *grouping;
    char *int_curr_symbol;
    char *mon_decimal_point;
    char *mon_grouping;
    char *mon_thousands_sep;
    char *negative_sign;
    char *positive_sign;
    char *thousands_sep;
    char frac_digits;
    char int_frac_digits;
    char n_cs_precedes;
    char n_sep_by_space;
    char n_sign_posn;
    char p_cs_precedes;
    char p_sep_by_space;
    char p_sign_posn;
    };

    struct lconv * localeconv(void);
    char * setlocale(int _category, const char *_locale);[/cpp]
    Und wenn ich mich recht errinere ist das sogar Standard, oder?

    Sowas habe ich gesucht... Suchen und Ersetzen ist ja schon klar, aber ich suchte sowas wie dies, wo ich das einmal und für immer in meinem Programm ändere, ...

    Aber eine Frage, warum funktioniert das bei mir nicht?

    Mein Code:

    #include <stdio.h>
    #include <string.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <locale.h>
    
    #define MAXBUF 256
    
    FILE *oldgum; /* FilePointer setzen */
    FILE *newgum;
    
    int saetze; /* Anzahl Datensaetze */
    
    char gumin[] = "Gumotop.dat"; /* Dateiname setzen */
    char gumout[] = "gimport.txt"; /* Dateiname setzen */
    char buffer[MAXBUF]; /* String mit maximal 256 Zeichen */
    char *replace;
    char pzn[MAXBUF];
    char aep[MAXBUF];
    char avp[MAXBUF];
    char ischar[MAXBUF];
    char von[MAXBUF];
    char bis[MAXBUF];
    
    float asfloat;
    
    struct lconv ll;
    struct lconv *conv = &ll;
    
    int main()
    {
     conv = localeconv();
     conv->decimal_point = ",";
     printf("Dezimal Punkt: %s\n", conv->decimal_point);
     newgum = fopen(gumout, "w");
     if ((oldgum = fopen(gumin, "r")) == NULL) { /* kann man Datei oeffnen */
      fprintf(stderr, "Datei kann nicht geladen werden! Vorhanden?\n\n"); /* wenn nein */
      fputs("Bitte Taste druecken, ...", stdout);
      getchar();
      exit(1);
     }
      else /* ansonsten */
     {
      while(fgets(buffer, MAXBUF, oldgum) != NULL) {
       memcpy(aep, (buffer + 48), 6); /* kopiere AEP in buffer */
       asfloat = atof(aep); /* konvertiere AEP in Gleitkommazahl */
       fprintf(newgum, "%.2f", asfloat/100); /* formatieren und ausgeben */
       fputs(";", newgum);
    
       fputs("\n", newgum);
       saetze++;
      }
     }
     fclose(oldgum); /* Dateien abschliesen */
     fclose(newgum);
     fputs("Bitte Taste druecken, ...", stdout);
     getchar();
     return 0;
    }
    

    So nun habe ich wieder in meiner Datei das stehen:

    21.51;
    23.65;
    55.77;

    So als Beispiele.

    Müsste nicht jetzt der Punkt durch ein Komma conv->decimal_point = ","; bei Dezimalen ersetzt werden. Weil nun statts Punkt ein Komma als "Trenner" genutzt wird?



  • Du hast dir zwar die aktuelle Einstellung geholt, aber du hast deine Änderung nicht zurückgeschrieben.

    *** hat dir eh beide Funktionen gepostet. Einmal localeconv zum Holen der aktuellen Einstellungen und dann noch setlocale zum Setzen der Einstellungen.



  • Ich habe es nun so gemacht und es klappt trotzdem nicht:

    conv->decimale_point = setlocale(LC_NUMERIC, ",");
    

    Werde aber aus dem Ganzen trotz Recherche im Internet und Probierens nicht schlau.

    Kann mir jemand Posten wie man es machen muss anhand meines Programmes? Vielleicht liegt es ja an etwas anderem?



  • Also das ganze funktioniert doch, nur der Compiler war zu alt - danke trotzdem für eure Hilfe. 🙂



  • Wie hast du es nun gemacht? Bei mir funktioniert weder

    conv->decimal_point = setlocale(LC_NUMERIC, ",");
    

    (was ich ausserdem für unsinnig halte)
    noch funktioniert

    struct lconv* conv = localeconv(); 
    	conv->decimal_point = ",";
    

    😞
    Ich benützte VC6 und und meine Ausgabe geht in ein ofstream objekt.
    jaja ich weiss diese Antwort gehört ins WINAPI oder C++ Forum, der Thread wurde jedoch hier gestartet


Anmelden zum Antworten