формат строки с% g в C - PullRequest
4 голосов
/ 06 мая 2009

Как создать строку, чтобы она форматировала числа с плавающей запятой, чтобы они не имели конечной десятичной точки или цифр, если она была целым числом, но НЕ переключались на научную запись для больших чисел?

Когда я делаю:

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);

Я получаю что-то вроде:

my float is 15.6
my int is 5
my large is 7e+07f

Мне нужна вся строка в одном формате, которая даст 15,6, 5 и 700000.

Отредактированные комментарии причины не форматируют:

Я так и думал. но обертка довольно неудобна, так как строки формата встроены в более длинные строки формата:

sprintf(buf, "%d %g", myInt, myFloat);

как вы это заверните?

sprintf(buf, "%d %g", myInt, Wrapper(myFloat));??

что должен вернуть Wrapper? Или хуже:

sprintf(buf, "%d %s", myInt, Wrapper(myFloat));?? 

Ответы [ 4 ]

10 голосов
/ 06 мая 2009

Вы можете отформатировать с помощью «%. * F», что позволяет передавать точность в качестве отдельного параметра, например, в. Sprintf. Я использовал это в прошлом, когда я хотел отображать 0, 1, 2 или, может быть, 3 цифры без дополнительных конечных 0. Напишите небольшую вспомогательную функцию, которая принимает double / float и возвращает целочисленную точность (умножив на 1000, а затем выполнив по модулю 10, 100, 1000). Затем вызовите sprintf с "%. * F", вызовите вспомогательную функцию и передайте число с плавающей точкой.

5 голосов
/ 06 мая 2009

Я не думаю, что вы можете получить это с %g, так как %g дает вам меньше %e или %f.

Итак, я не думаю, что есть единственный аргумент printf, который удовлетворит вас. Для 15,6 вы можете использовать %2.1f; для 7000000 вы можете использовать %7.0f.

Лучше всего вам написать функцию-оболочку, которая бы смотрела на размер вашего значения и применяла правильный аргумент printf.

1 голос
/ 09 июля 2016

Замените% g на% .10g, чтобы отобразить до 10 значащих цифр

1 голос
/ 06 мая 2009

Подход Майка разумен, но вы можете вычислить количество цифр напрямую, используя функцию log10, и использовать floor или ceil, чтобы убедиться, что у вас действительно целочисленное значение. Что-то вроде:

#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);
}

Распаковывая эту цепочку вызовов функций, мы сначала берем абсолютное значение, чтобы убедиться, что аргумент неотрицательный, добавляем 0,5 к известному целочисленному значению, чтобы учесть любые возможные ошибки округления при вычислении log10 с точной степенью 10 , объедините log10 и floor, чтобы получить показатель степени наибольшей степени 10 меньше, чем fabs (x) +0.5, и, наконец, добавить 1, чтобы получить количество цифр, необходимое для представления x. Вот некоторые примеры значений (из OpenOffice, но функция C log10 должна вычислять с одинаковой точностью):

         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
...