String-Format mit% g in C
Frage
Wie erstelle ich einen String, so dass es formatiert Gleitkommazahlen keine Hinter Komma oder Ziffern zu haben, wenn es eine ganze Zahl ist, sondern auch für eine größere Anzahl an wissenschaftliche Schreibweise wechseln NICHT?
Wenn ich tun:
float myFloat= 15.6f;
float myInt = 5.0f;
float myLarge = 7000000.0f;
sprintf(out, "my float is %g", myFloat);
sprintf(out, "my int is %g", myInt);
sprintf(out, "my large is %g", myLarge);
ich so etwas wie:
my float is 15.6 my int is 5 my large is 7e+07f
Ich habe alle einzelnen Format-String möchten, 15.6 geben, 5 und 700000.
Edited Ursache Kommentare Formatierung nicht tun:
das ist, was ich dachte. aber ein Wrapper ziemlich unbequem ist, obwohl, wie die Formatstrings werden in mehr Format-Strings eingebettet:
sprintf(buf, "%d %g", myInt, myFloat);
Wie wickeln Sie das?
sprintf(buf, "%d %g", myInt, Wrapper(myFloat));??
Was soll Rückkehr Wrapper? Oder noch schlimmer:
sprintf(buf, "%d %s", myInt, Wrapper(myFloat));??
Lösung
Ich glaube nicht, dass Sie dies mit %g
bekommen können, wie %g
Sie die kürzere von %e
oder %f
gibt.
Also, ich glaube nicht, dass es ein einziges printf
Argument, das Sie erfüllt. Für 15,6, könnten Sie %2.1f
verwenden; für 7000000, könnten Sie %7.0f
verwenden.
Ihre beste Wette ist wahrscheinlich eine Wrapper-Funktion zu schreiben, die auf der Größe Ihres Wertes aussehen würden und das richtige printf
Argument gelten.
Andere Tipps
Sie können die Formatierung mit „%. * F“, mit dem Sie die Präzision als separate Parameter zu übergeben ermöglicht z.B. sprintf. Ich habe dies in der Vergangenheit, wenn ich wollte, 0, 1 angezeigt werden, 2 oder vielleicht 3 Ziffern schön ohne zusätzliche Hinter 0en. Schreibe eine kleine Hilfsfunktion, die die Doppel / float nimmt und gibt eine ganzzahlige Genauigkeit (von mit 1000 multipliziert und dann modulo 10 tun, 100, 1000). Dann sprintf ruft mit "%. * F", rufen Sie die Hilfsfunktion, und den Schwimmer übergeben.
Mike Ansatz ist vernünftig, aber Sie können die Anzahl der Stellen berechnen direkt die log10-Funktion, und verwenden entweder Boden oder ceil, um sicherzustellen, dass Sie in der Tat einen Integer-Wert haben. So etwas wie:
#include <math.h>
double x;
...
if (floor(x) == x && x != 0.0) { // x is an non-zero integer value
int digits = floor(log10(fabs(x)+0.5)) + 1;
printf("x is %.*f\n", digits, x);
}
Auspacken, dass die Kette von Funktionsaufrufen, nehmen wir zunächst den absoluten Wert um sicherzustellen, dass das Argument nicht negativ ist, fügen Sie 0,5 bis den bekannten ganzzahligen Wert von möglichen Rundungsfehlern zu kümmern log10 einer exakten Leistung von 10 bei der Berechnung kombinieren, log10 und Boden die Exponenten der größten Leistung von 10 weniger als fabs (x) erhalten +0,5, und schließlich 1 fügen Sie die Anzahl der stellen zu bekommen benötigt x darzustellen. Hier sind einige Beispielwerte (von Openoffice, aber die C log10 Funktion in ähnlicher Genauigkeit berechnen soll):
x log10(x+0.5)
1 0.176091259055681000
9 0.977723605288848000
10 1.021189299069940000
99 1.997823080745730000
100 2.002166061756510000
999 2.999782798454140000
1000 3.000217092972230000
10000 4.000021714181250000
100000 5.000002171466980000
1000000 6.000000217147190000
10000000 7.000000021714720000
100000000 8.000000002171470000
1000000000 9.000000000217150000
Ersetzen% g mit% .10g zu zeigen, bis zu 10 signifikanten Zahlen