是否可以使用 printf 使点 "floating" 取决于值?
Is it possible, with printf, to have the dot "floating" depending on the value?
我希望转换后的字符串始终包含 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”格式字符串吗?
不,您不必动态生成字符串。你可以这样做:
printf("%0*.5f", width, value);
您可以进一步自定义它,以获得可变的精度:
printf("%0*.*f", width, precision, value);
对于第一种形式,类似于:
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++)
;
我希望转换后的字符串始终包含 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”格式字符串吗?
不,您不必动态生成字符串。你可以这样做:
printf("%0*.5f", width, value);
您可以进一步自定义它,以获得可变的精度:
printf("%0*.*f", width, precision, value);
对于第一种形式,类似于:
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++)
;