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));?? 
War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top