формат строки для значений с плавающей точкой printf - PullRequest
5 голосов
/ 30 октября 2011

У меня есть вопрос об использовании printf.

char str[8];
float val = 2.334563;
sprintf(str, format, val);
printf("val = %s.\n", str);

val = -23.34563;
sprintf(str, format, val);
printf("val = %s.\n", str);

val = -0.02334563;
sprintf(str, format, val);
printf("val = %s.\n", str);

val = 233;
sprintf(str, format, val);
printf("val = %s.\n", str);

Ожидается следующий вывод:

val = +2.3345
val = -23.345
val = -0.0233
val = +233.00

Какой формат строки мне нужен для этого?Спасибо за внимание.

Ответы [ 5 ]

3 голосов
/ 30 октября 2011

что случилось со старым добрым %f

1 голос
/ 30 октября 2011

Следующее (почти) делает то, что вы хотите.Обратите внимание, что я изменил количество символов в массиве str с 7 до 8;поскольку все ваши выходные строки содержат 7 символов, прерывание NULL, выполняемое sprintf, приведет к переполнению буфера в противном случае.

Единственное различие между моими результатами и вашим - округление, выполняемое sprintf.AFAIK, единственный способ обойти это - предварительно обрезать число, которое вы хотите напечатать, используя floor;например, чтобы напечатать 2 цифры без округления float f = floor( 1.8888 * 100 ) / 100;

#include <stdio.h>

int main(void)
{
  char str[8];

  {
    float val = 2.334563f;
    sprintf(str, "%+6.*f", 4, val);
    printf("val = %s.\n", str);
  }

  {
    float val = -23.34563f;
    sprintf(str, "%+6.*f", 3, val);
    printf("val = %s.\n", str);
  }

  {
    float val = -0.02334563f;
    sprintf(str, "%+6.*f", 4, val);
    printf("val = %s.\n", str);
  }

  {
    float val = 233.0f;
    sprintf(str, "%+6.*f", 2, val);
    printf("val = %s.\n", str);
  }

  return 0;
}

Вывод:

val = +2.3346.
val = -23.346.
val = -0.0233.
val = +233.00.
1 голос
/ 30 октября 2011

используйте snprintf() для усечения строки ровно с 8 символами, включая \0

Формат строки:

"%#+.5f"

%   modifier
#   force decimal place
+   show + or -
.5  precision of 5
f   use precision as places after decimal 

Код:

char str[8];
float val = 2.334563;
snprintf(str,8, "%#+.5f", val);
printf("val = %s\n", str);

val = -23.34563;
snprintf(str,8, "%#+.5f", val);
printf("val = %s\n", str);

val = -0.02334563;
snprintf(str,8, "%#+.5f", val);
printf("val = %s\n", str);

val = 233.001;
snprintf(str,8, "%#+.5f", val);
printf("val = %s\n", str);

Выход:

val = +2.3345
val = -23.345
val = -0.0233
val = +233.00
val = +0.0003
0 голосов
/ 30 октября 2011

Единственное, что я могу придумать, это следующее:

const char *format = "val = %+6.*f\n";
int places_past_decimal = ???;
printf(format, places_past_decimal, 2.334563f);

В этом случае вам нужно будет передать дополнительный аргумент (places_past_decimal), который представляет собой количество цифр, оставшихся в числе, которые не используются в левой части номера.

0 голосов
/ 30 октября 2011
"%f"

пример

printf("%f\n", floatVal);
...