Получение printf () для удаления завершающего ".0" значений - PullRequest
5 голосов
/ 09 марта 2010

Мне нужно напечатать числа с плавающей запятой со следующими требованиями к форматированию:

  • 5.12345 должен отображать только 5.1

  • 5.0 следует только 5 (без .0)

  • 5.0176 должен отображать только 5 (без .01)

Я думал, что printf() может сделать что-то подобное ... но сейчас я не могу заставить его работать.

Ответы [ 6 ]

8 голосов
/ 09 марта 2010

Вы можете получить вид, близкий к желаемому, используя "% g"

#include <stdio.h>

int main(int argc, char* argv[])
{
        printf("%.6g\n", 5.12345f);
        printf("%.6g\n", 5.0f);
        printf("%.6g\n", 5.0176f);
        return 0;
}

Выход:

5.12345
5
5.0176

"% g" удалит завершающие нули.

2 голосов
/ 09 марта 2010

Звучит так, будто вы хотите напечатать 1 десятичное место, а если это место 0, отбросьте его Эта функция должна работать нормально:

// prints the float into dst, returns the number
// of chars in the manner of snprintf. A truncated
// output due to size limit is not altered.
// A \0 is always appended. 
int printit(float f, char *dst, int max) {
  int c = snprintf(dst, max, "%.1f", f);

  if(c > max) {
    return c;
  }

  // position prior to '\0'
  c--;

  while(dst[c] == '0') {
    c--;
    if(dst[c] == '.') {
      c--;
      break;
    }
  }
  dst[c + 1] = '\0';  
  return c + 1;
}

int main(void) {
  char num1[10], num2[10], num3[10];
  printit(5.12345f, num1, 10);
  printit(5.0f, num2, 10);
  printit(5.0176f, num3, 10);
  printf("%s\n%s\n%s\n", num1, num2, num3);
}
1 голос
/ 09 марта 2010

Ни один из операторов форматирования не поддерживает это, однако вы можете сначала отфильтровать от float до sprintf(), а затем обрезать строку там, где это необходимо. Это избавит вас от необходимости преобразовывать число с плавающей точкой в ​​строку, и логика сделать все остальное проста.

1 голос
/ 09 марта 2010

printf () может использовать строки форматирования. Посмотрите параметры ширины и точности строк форматирования:

printf("%.1f", 5.12345f);

Будет напечатано 5.1.

К сожалению, он не имеет возможности автоматически определять, без указания, что отображать. (Например, ваш последний вариант для меня неясен - почему он должен опускать «.0176», а вы не говорите, что не хотите десятичных точек?)

1 голос
/ 09 марта 2010

Не так, как вы это описали, нет. Если вам нужны условные десятичные разряды, вы должны сделать это сами.

Прошло много времени с тех пор, как я испортил форматы printf, но в большинстве случаев это работает

char *BuildConditionalFormat(double val)
{
    int tenths = (int)(val * 10) % 10;
    if (tenths == 0)
        return ".0f";
    return ".1f";
}

/* test rig */
float f = 5.0;
printf(BuildConditionalFormat(f), f); /* -> 5 */
f = 5.13;
printf("\n");
printf(BuildConditionalFormat(f), f); /* -> 5.1 */
printf("\n");

Это соответствует вашим правилам, но также предоставит интересный урок о том, почему воняет с плавающей запятой, потому что 5.1 -> 5. Почему? Потому что 5.1 не представляется чисто (на моей машине) как float - это 5.09999 и некоторые другие изменения.

Скорее всего, вам нужно узнать о floor () и ceil () тоже ...

0 голосов
/ 09 марта 2010

Вы можете указать printf печатать указанное количество цифр после '.' , но если вы хотите различать формат в зависимости от значения, вы должны написать код, чтобы различать интересные вам случаи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...