2016-09-29 3 views
-1

Es war einmal diese kleine FunktionC/C++ sprintf Formatierung -0

string format_dollars_for_screen(float d) 
{ 
    char ch[50]; 
    sprintf(ch,"%1.2f",d); 
    return ch; 
} 

die -0.00 zurückkehren gern.

I modifiziert es

string format_dollars_for_screen(float d) 
{ 
    char ch[50]; 
    float value; 
    sprintf(ch,"%1.2f",d); 
    value = stof(ch); 
    if(value==0.0f) sprintf(ch,"0.00"); 
    return ch; 
} 

Und es begann 0.00 nach Wunsch zurück. Meine Frage ist, warum funktioniert diese andere Lösung nicht?

string format_dollars_for_screen(float d) 
{ 
    char ch[50]; 
    float value; 
    sprintf(ch,"%1.2f",d); 
    value = stof(ch); 
    if(value==0.0f) sprintf(ch,"%1.2f", value); 
    return ch; 
} 

Und/oder gibt es eine effizientere Möglichkeit, dies zu tun? Das ist nur von der Spitze meines Kopfes, also sind Kritiken willkommen. =)

+0

Betrachtet man Sie mit 'sprintf' und fester Länge Zeichenpuffer (igitt!) das ist nur C-Code auseinander von der Tatsache, dass Sie 'string' zurückgeben. – tadman

+0

@tadman: Sie geben eine Zeichenfolge zurück, und in C++ haben Sie immer noch keine gute Standardformatierungslösung. – ybungalobill

+0

@ybungalobill Hängt von Ihrer Definition von "gut" ab. Es ist nicht wie [dies ist ein ungelöstes Problem] (http://stackoverflow.com/questions/29200635/convert-float-to-string-with-set-precision-number-of-decimal-digits). – tadman

Antwort

3

Fließkommazahlen haben beide ein plus-null und ein minus-null. Sie vergleichen den Operator mit dem Operator ==, erzeugen aber andere Ergebnisse in anderen arithmetischen Ausdrücken: 1/+0 == +inf, aber 1/-0 == -inf.

Für Ihren Fall sollten Sie keine Gleitkommazahlen für monetäre Größen verwenden. Verwenden Sie stattdessen ganze Zahlen für Cent (oder andere Dezimalbrüchen Cent) zu zählen, und formatieren Sie sie entsprechend:

string format_dollars_for_screen(int cents) 
{ 
    bool neg = cents < 0; 
    if(neg) cents = -cents; 
    char ch[50]; 
    sprintf(ch, "%s%d.%.2d", "-"+!neg, cents/100, cents%100); 
    return ch; 
} 
+2

Es lohnt sich wirklich zu betonen ** benutze niemals Fließkomma um Geld darzustellen **. Es wird zu nichts als Verwirrung, Schmerz, Leid und einem Albtraum für Ihre Buchhalter führen. – tadman

+0

Außerdem gibt es keine -0 für Ints. –

+0

Für was es wert ist, wird das Geld als 'int' gespeichert. Der Wert, der als Float übergeben wird, wird buchstäblich nur zu Cent reduziert. Daher 'format_dollars_for_screen()'. Also keine Sorgen. ;) Außerdem: Könnte ich dir Schwierigkeiten bereiten zu erklären, wie '" + "+! Neg' funktioniert? – musasabi