日期:2014-05-20  浏览次数:20741 次

f.format 简单问题
f.format("%-10.12s %-2.3s %-8s","==============1111111112qsassasa","====","==========");
第一个%-10.12控制长度的是后缀的12吧?那10有什么用啊?
还有,%-3d:
format("%-10.12s %-3d %5d","sdsdsdsdsfvv",2323,2222222222222222222);
为什么,3,5都没有用啊?就是不能在长度为3||5的时候舍弃后面?


------解决方案--------------------
2222222222222222222 这个超过 整型的范围了吧
------解决方案--------------------
%-10.12s 
12个字符的输出在10列范围的左侧 12>10 正常输出

%-3d:
正常输出十进制数

%md
数据位数大于m,则按实际位数输出
------解决方案--------------------
%d,按十进制整型数据的实际长度输出,而%-3d与%d的输出结果一样。
%md,m是指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际长度输出。
%-10.12s 是%-m.ns输出占m列,但只取字符串中左端的n个字符。这n个字符输出在m列的左侧,右补空格,,如果n>m,则m自动取n值,即保证n个字符的输出。
------解决方案--------------------
感觉回到刚学C的时候了……

格式控制串其实是一套十分复杂的系统,特别是格式控制标志,各种组合可以形成多种效果。
在下无聊来总结下C语言的格式控制以及与Java控制串的不同:

格式控制串标准形式:
%[格式控制标志][输出的最小宽度][.精度][长度说明符][类型说明符]

先从简单的开始:

类型说明符:
整型:(注除10进制外都是无符号)
%d 10进制有符号整数
%i 10进制有符号整数(等同于%d)(Java不支持此说明符)
%u 10进制无符号整数(Java不支持无符号数,故也不支持%u)
%o 8进制无符号整数
%x 16进制无符号整数

浮点型:
%f 10进制浮点型(严格按照精度要求输出小数位数,小数位数不足则补0,超过则四舍五入截断)(默认精度为6)
%g 10进制浮点型(与%f输出类似,小数位数超过精度四舍五入截断,但不足时不会补0)(Java其实没有实现%g类型,在下用的JDK7中%g与%f输出效果一样)
%e e-指数形式(通常说的科学计数法),aEb表示a*10^b
%a p-计数法(C-99开始引入,Java中也可使用),实质就是将浮点数的尾数与阶码分别用16进制表示放于p的两边

指针:
%p 与%x类似,只是%p有固定的输出宽度(与地址总线位数相同),长度不足则补0(Java不支持指针,故也不支持%p)

字符串相关:
%c 字符
%s 字符串

转义:
%% 字符'%'

Java新增类型:
%b %B 布尔型,对应参数为boolean时为对应的布尔值,否则为true(%B为TRUE)
%h 16进制整型(同%x)

输出最小宽度:
没什么需要说明的,唯一需要注意的是它表示的是最小宽度
------解决方案--------------------
(上接5楼)
.精度:
精度控制对于不同类型意义不同。
整型:
输出宽度(如实际宽度不足则左补0)(注:Java不支持整型的精度控制)
浮点型:
小数最大位数(不包括小数点)
指针:
无意义
字符:
无意义
字符串:
最大输出宽度(也可理解为按此宽度将字符串截断)
转义:
无意义
布尔型:
最大输出宽度(与字符串一样)

长度说明符:
这是C/C++为了提高运行效率,用于标示参数实际类型的说明符,只作用于数值类型,于其它类型无意义。用比实际类型长度小的说明符可起到截断作用。(Java不是太重视运行效率,且这种用法会提高程序的不确定性,所以Java不支持此说明符)
h 对整型而言就是short int,由于不存在short float,故此说明符对浮点数无意义
l 对整型而言是long int,对浮点型而言是double
ll 对整型而言是long long int,对浮点型而言是long double(C-99引入)
------解决方案--------------------
(上接6楼)
格式控制标志:
注:格式控制标志可重复,可组合,重复的控制标志与不重复的效果一样。(Java不允许重复控制标志,只允许组合)

(无) (实际宽度<最小宽度时)左补空格
- (实际宽度<最小宽度时)右补空格
+ 显式输出符号,不论正负(非数值类型无效)
# 按字面量的方式输出(%o输出增加前缀"0",%x输出增加前缀"0x",其它类型原样输出),Java不允许非数值类型与原创类型(包括%h)使用此标志
0 (实际宽度<最小宽度时)左补0
(空格) 这是最复杂的控制标志了,主要用于组合格式控制。单独使用效果为左补一空格。

以上只是控制标志单独使用的效果,有兴趣的可以自己尝试组合控制效果。