Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Falsche Eingabe von Gleitpunkzahlen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
10.12.2003, 07:38 Uhr
derphilipder



Moin!
Fällt irgendjemanden ne Möglichkeit ein, die Eingabe von Gleitpunktzahlen mit Komma, durch den Anwender, zu erkennen und vielleicht sogar automatisch zu korrigieren? Letzeres dürfte schwierig sein, oder?
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.12.2003, 08:35 Uhr
ao

(Operator)


1. Die Eingabe in einem String erfassen (mit fgets, nicht mit scanf).
2. Nachsehen, ob der String ein Komma enthält (mit strchr)
3. Ggfs. das Komma durch einen Punkt ersetzen
4. Umwandeln in eine Gleitpunktzahl mit strtod oder sscanf

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.12.2003, 15:22 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



C++:
bool isNumber(char* number){
    char flag=0,*p=number;
    if(!*p) return false;
    if(*p=='-'||*p=='+')++p;
    for(;*p;++p)
        if(!isdigit(*p))
            if(flag || *p!='.' )return false;
            else ++flag;
    return true;
}

bool str2double(double* number,char* str){
for(char *p=str;*p;++p) if(*p==','){*p='.';break;}
if(!isNumber(str))return false;
*number=atof(str);
return true;
}

int main(){
char zahl[]="37,34567";
double x;
if(str2double(&x,zahl))printf("%f\n",x);
else printf("Keine Zahl\n");    
return 0;
}


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.12.2003, 17:24 Uhr
virtual
Sexiest Bit alive
(Operator)


@Windalf
Und was passiert bei Zahlen mit nem e drin? "1,3e7"?
Also ich finde das "automatische Korrigieren" an sich schon einen fragwürdigen Ansatz: ich würde eher sagen, man sollte das Programm vernünftig lokalisieren, so daß der Benutzer einfach sei Sprache einstellt und damit auch die von oihm bevorzugte Schreibweise. setlocale ist hier das Schlüsselwort-
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.12.2003, 17:29 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@virtual
upsi frisst atof auch die dinger mit dem e
na gut das sollte ja kein problem sein nachzuschieben oder?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.12.2003, 17:46 Uhr
ao

(Operator)


@Windalf: Alles, was du hier mühsam ausprogrammiert hast, kann man mit C-Library-Funktionen auch geschenkt haben.

Es ist (fast) immer ein Fehler, etwas selber zu programmieren, für das es eine Library-Funktion gibt.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.12.2003, 17:50 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@ao und virtual

dann macht doch mal bitte ein beispiel wie ich das mit diesem setlocale machen muss. das in der hilfe peil ich leider gerade gar nicht....
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.12.2003, 18:02 Uhr
ao

(Operator)



C++:

#include <stdio.h>
#include <locale.h>

int main (void)
{
    setlocale (LC_ALL, "german"); /* oder "english", ... */
    printf ("%f\n", (1.0 / 2.0));

    setlocale (LC_ALL, "C"); /* Voreinstellung fuer C */
    printf ("%f\n", (1.0 / 2.0));
    return 0;
}



ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
10.12.2003, 18:07 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@ao
danke

so einfach ist das also... hmm mal schauen ob ich mich damit anfreunden kann...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
10.12.2003, 22:04 Uhr
virtual
Sexiest Bit alive
(Operator)


Man sollte noch fairerhalber erwähnen, daß die Werte, die man als zweiten Paremeter an setlocale übergibt, nicht standardisiert sind. In der UNIX Welt werden im Allg. Umgebungsvariablen LC_ALL, LC_MESSAGES usw. gesetzt, und im C Programm dann mittels getenv ausgelesen um sie als zweiten parameter zu übergeben,
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: