博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】字符串和浮点数格式化输出小结
阅读量:5023 次
发布时间:2019-06-12

本文共 2366 字,大约阅读时间需要 7 分钟。

原文网址:http://blog.chinaunix.net/uid-41120-id-2406354.html

最近做一点报表的问题,总是会发生错行错位现象。发现格式化还有些细节部分要总结一下。
 
字符串格式化和浮点数格式化是不同的:
 
一:字符串格式化
 
#include
int main()
{
    char buff1[] = "12345", buff2[] = "123456789012345";
 
    printf("buff1 = [%s], buff2 = [%s]\n\n", buff1, buff2);
 
    //不足10位要保证10位长度,左补或右补空格,否则实数输出
    printf("    %%10s = [%10s]     [%10s]\n", buff1, buff2);
    printf("   %%-10s = [%-10s]    [%-10s]\n\n", buff1, buff2);
 
    //保证不超过10位,否则只取前10位(两者一样?记得上次看到好像不同样的嘛)
    printf("   %%.10s = [%.10s]    [%.10s]\n", buff1, buff2);
    printf("  %%-.10s = [%-.10s]   [%-.10s]\n\n", buff1, buff2);
 
    //保证一定输出10位,不足则左或右补空格,超出则只取前10位
    printf(" %%10.10s = [%10.10s]  [%10.10s]\n", buff1, buff2);
    printf("%%-10.10s = [%-10.10s] [%-10.10s]\n", buff1, buff2);
}
输出:
buff1 = [12345], buff2 = [123456789012345]
    %10s = [     12345]     [123456789012345]
   %-10s = [12345     ]    [123456789012345]
   %.10s = [12345]    [1234567890]
  %-.10s = [12345]   [1234567890]
 %10.10s = [     12345]  [1234567890]
%-10.10s = [12345     ] [1234567890]
 
所以一般使用%.10s或%-.10s来打印字符串比较好,左对齐,然后只可能输出最大固定长度的字符串。这样对于一个固定的报表格式来讲是比较合适的。
 
二:浮点数格式化
 
#include
int main()
{
    double d1 = 12345.235, d2 = 123456789012.345;
 
    printf("d1(%%f) = [%f], d2(%%f) = [%f]\n\n", d1, d2);
 
    //只是保证只输出两位小数(两者一样,看来没必要用%-.2lf)
    printf("   %%.2lf = [%.2lf]    [%.2lf]\n", d1, d2);
    printf("  %%-.2lf = [%-.2lf]   [%-.2lf]\n\n", d1, d2);
 
    //保证输出至少10位,不足10位左或右补空格
    printf(" %%10.2lf = [%10.2lf]  [%10.2lf]\n", d1, d2);
    printf("%%-10.2lf = [%-10.2lf] [%-10.2lf]\n", d1, d2);
}
输出:
d1(%f) = [12345.235000], d2(%f) = [123456789012.345001]
   %.2lf = [12345.24]    [123456789012.35]
  %-.2lf = [12345.24]   [123456789012.35]
 %10.2lf = [  12345.24]  [123456789012.35]
%-10.2lf = [12345.24  ] [123456789012.35]
 
所以浮点数用%10.2lf来控制是不行的,因为它不能固定最大长度,一般实际应用中只用到金额的控制,所以后面一般用.2lf来控制两位小数(否则的话浮点数可能会输出6位小数)。而且控制至少10位的长度时有时会补空格,这会带来问题,如果一个表格要填金额,而如果这个制表函数控制了某种方式表示左对齐或右对齐,比如说右对齐(就是尽量靠表格的右边来显示数据),而你用%-10.2lf的输出话,那么输出的会用右空格来补齐10位以达到固定长度,那么其实在表格中就显示出左对齐来了。所以就会达不到作者想表达的意思。
所以最好的方式是不要输出空格补位,但又不能固定最大长度,只能固定最小长度,所以有个办法是先把浮点数转成字符串,再用字符串来格式化以达到固定最大长度的要求,如:
 
#include
int main()
{
    char buff1[20] = {0}, buff2[20] = {0};
    double d1 = 12345.235, d2 = 123456789012.345;
 
    snprintf(buff1, sizeof(buff1), "%.2lf", d1);
    snprintf(buff2, sizeof(buff2), "%.2lf", d2);
 
    printf("%%-.10s = [%-.10s]   [%-.10s]\n", buff1, buff2);
}
输出:
%-.10s = [12345.24]   [1234567890]
 
当然,对于金额数据截断肯定不行,所以还是应该考虑使用最大可能的预留空间,比如20位空间来保证最大金额数。那样就只需用%.2lf来控制就行了。
 
 

转载于:https://www.cnblogs.com/wi100sh/p/5054392.html

你可能感兴趣的文章
T-SQL 类型转换
查看>>
在eclipse中设计BPMN 2.0工作流定义的根本步骤
查看>>
Json对象与Json字符串互转(4种转换方式)
查看>>
PAT甲级1002 链表实现方法
查看>>
查看Linux信息
查看>>
Python中sys模块sys.argv取值并判断
查看>>
【详记MySql问题大全集】四、设置MySql大小写敏感(踩坑血泪史)
查看>>
并查集
查看>>
ubuntu 11.04下android开发环境的搭建!
查看>>
Bzoj 3343: 教主的魔法
查看>>
括号序列(栈)
查看>>
一件趣事
查看>>
DevExpress控件TExtLookupComboBox实现多列模糊匹配输入的方法
查看>>
atom 调用g++编译cpp文件
查看>>
H3C HDLC协议特点
查看>>
iptables 网址转译 (Network address translation,NAT)
查看>>
ios __block typeof 编译错误解决
查看>>
android 插件形式运行未安装apk
查看>>
ios开发之 manage the concurrency with NSOperation
查看>>
Android权限 uses-permission
查看>>