Возможно ли с помощью printf точка «плавать» в зависимости от значения? - PullRequest
1 голос
/ 10 января 2020

Я хочу, чтобы моя преобразованная строка всегда принимала N символов, примерно так:

100000.f -> "00100000.0"
10000.f  -> "00010000.0"
1000.f   -> "00001000.0"
100.f    -> "00000100.0"
10.f     -> "00000010.0"
1.f      -> "00000001.0"
0.1f     -> "00000000.1"
0.01f    -> "0000000.01"
0.001f   -> "000000.001"
0.0001f  -> "00000.0001"

или примерно так:

100000.f -> "100000.000"
10000.f  -> "10000.0000"
1000.f   -> "1000.00000"
100.f    -> "100.000000"
10.f     -> "10.0000000"
1.f      -> "1.00000000"
0.1f     -> "0.10000000"
0.01f    -> "0.01000000"
0.001f   -> "0.00100000"
0.0001f  -> "0.00010000"

Конечно, строка может увеличиваться, если десятичная часть слишком велика, но до сих пор меня это не беспокоит.

Должен ли я динамически генерировать строку формата "% 05.5f"?

Ответы [ 2 ]

1 голос
/ 10 января 2020

Для первой формы, что-то вроде:

buf[0] = '0';
for (i=0; i<8 && buf[0]=='0'; i++)
    snprintf(buf, sizeof buf, "%10.*f", i, x);

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

Для второй формы что-то вроде:

for (i=0; i<8 && snprintf(buf, sizeof buf, "%.*f", i, x)<10; i++)
    ;
0 голосов
/ 10 января 2020

Нет, вам не нужно генерировать строку динамически. Вы можете просто сделать это так:

printf("%0*.5f", width, value);

Вы можете настроить его даже дальше, чтобы иметь переменную точность:

printf("%0*.*f", width, precision, value);
...