C printf необязательные десятичные знаки - PullRequest
2 голосов
/ 30 мая 2020

В C# я могу сделать следующее:

Console.Write("{0}, ", string.Format("{0:0.00###########}", someFloatValue));

, чтобы получить как минимум 2 десятичных знака для некоторого произвольного значения с плавающей запятой до определенного количества необязательных десятичных знаков, в данном случае 13.

Мне было интересно, возможно ли то же самое с printf в C?

Ответы [ 2 ]

1 голос
/ 01 июня 2020

Завершить нулевые цифры в конце.

void formatDouble(char* buf, double val, int precMin, int precMax) {
  int length = sprintf(buf, "%.*f", precMax, val);
  if (isfinite(val) && length > 0) {
    for (int i = precMax; i > precMin; i--) {
      if (buf[length - 1] == '0') {
        buf[--length] = '\0';
      } else {
        break;
      }
    }
  }
}

void fooo(double d) {
  char buf[100];
  formatDouble(buf, d, 2,6);
  printf("<%s>\n", buf);
}

int main(void) {
  fooo(0.1234567890);
  fooo(0.123450);
  fooo(0.12300);
}

Вывод

<0.123457>
<0.12345>
<0.123>
0 голосов
/ 30 мая 2020

Спасибо за ссылки, которые дали некоторое руководство. Вот что я придумал: он позволяет вам указывать минимальную и максимальную точность, поэтому он ведет себя больше как функция C#, а также округляет последнее di git. Дайте мне знать, если нужно внести какие-то оптимизации или изменения.

void formatDouble(char* buf, double val, int precMin, int precMax) {
    sprintf(buf, "%.*f", precMax, val);
    int startpos = 0;
    int length = strlen(buf);
    bool found = false;
    for (int z = 0; z < length; z++)
    {
        if (buf[z] == '.')
        {
            startpos = z;
            found = true;
            break;
        }
    }
    if (!found)
        return;
    int endIndex = startpos + precMin;
    found = false;
    for (int z = precMax + startpos; z >= startpos + precMin; z--)
    {
        if (buf[z] >= '1' && buf[z] <= '9')
        {
            endIndex = z;
            if (endIndex < startpos + precMax)
            {
                // Round Digit
                if (buf[z + 1] >= '5')
                    buf[z]++;
            }
            found = true;
            break;
        }
    }
    for (int z = endIndex + 1; z <= length; z++)
    {
        if (z <= startpos + precMax)
            buf[z] = 0;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...