用填充打印浮点数的格式化输出

43
以下测试代码使用了宽度参数,但仍会产生不希望的输出结果。

以下测试代码使用了宽度参数,但仍会产生不希望的输出结果:

int main(int , char* [])
{
    float test = 1234.5f;
    float test2 = 14.5f;

    printf("ABC %5.1f DEF\n", test);
    printf("ABC %5.1f DEF\n", test2);

    return 0;
}

输出

ABC 1234.5 DEF   
ABC  14.5 DEF
如何实现这样的输出,需要使用哪种格式字符串?
ABC 1234.5 DEF   
ABC   14.5 DEF

这看起来像是C语言,而不是C++。你是否打算标记为C++? - hmjd
1
@hmjd:我的真实代码是C++,但这个例子是纯C。所以你是对的,我会尝试重新标记它。 - nabulke
2个回答

73

以下内容应该可以正确地对齐一切:

printf("ABC %6.1f DEF\n", test);
printf("ABC %6.1f DEF\n", test2);

当我运行这个时,我得到:

ABC 1234.5 DEF
ABC   14.5 DEF
问题在于,在%5.1f中,5是为整个数字分配的字符数,而1234.5占用了超过五个字符。这导致与14.5的错位,因为它适合五个字符。

4
是的,每个字符都很重要。 - NPE

17

您正在尝试打印比5个字符更宽的内容,因此请将长度说明符调大:

printf("ABC %6.1f DEF\n", test);
printf("ABC %6.1f DEF\n", test2);

第一个值不是“小数点前的数字”,而是“总长度”。

请注意,如果您有可能打印无穷大或NaN,您可能需要在小数点后提供更多的空间(至少4个字符)。然后它变成了这样:printf("ABC %10.4f DEF\n", test); - phyatt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接