Java格式化输出printf()详解
概要: 本⽂通过实例详细介绍Java格式化输出 System.out.printf() ⽅法的使⽤、参数的含义、格式转换符使⽤时的注意事项。
⽂章⽬录
小新星总网System.out.printf() 是 Java 5 开始引⼊的,⽤法类似 C语⾔的 printf() 函数, 但注意存在⼀定差异。 1. printf API // 使⽤指定的格式字符串和参数将格式化字符串写⼊⼊到输出流 public PrintStream printf(String format, Object ... args) // 基于本地化环境使⽤指定的格式字符串和参数将格式化字符串写⼊到输出流 public PrintStream printf(Locale l, String format, Object ... args) 12345 以上2个⽅法,当 format 为 null 时,抛出 NPE. 2. 参数说明 1. format format 是以百分号(%) 开头的格式说明字符串,具体格式如下 % [argument_index$][flags][width][.precision]conversion 1 可选的 argument_index 是⼗进制整数,表⽰参数列表中参数的位置。 第⼀个参数由“ 1$ ”引⽤,第⼆个由“ 2$ ” 引⽤ ,等等。 argument_index 必须紧跟%后⾯,并以$ 结束。 note: 参数索引值从1开始,⽽不是从0开始,%1$ 对第⼀个参数格式化。这就避免了与0标志混淆。 可选 flags 指定格式化输出外观的各种标志。 有效标志集取决于 conversion。 可选 width是正⼗进制整数,表⽰要写⼊到输出的字符个数(注意对于浮点数:也包含⼩数点所占的1个字和 负数的负号所占的1个字符)。 当实际字符数⼩于指定的宽度时,
最前⾯⽤ flags 指定的标志填充(若未指定,默认⽤空格)。 eg: v=2.3, %5.2f 输出5.20,且前⾯包含1个空格。共打印5个字符,整数位1个5,1个⼩数点,2个精度,长度为4,⽐指定的宽度少1为,⽤1个前导空格代替。 可选 precision 是⼀个⾮负⼗进制整数,通常⽤于限制字符数。 具体⾏为取决于转换。 conversion (必需) 是⼀个字符,指⽰如何格式化参数。 给定参数的有效转换集取决于参数的数据类型。 表1-⽤于printf flags(标志) 说明 标志⽬的⽰例+打印正数和负数的符号+3333.33空格在正数之前添加空格| 3333.33|0数字前⾯补0003333.33-左对齐(不指定-时,默认为右对齐)|3333.33 |(将负数括在括号内%d,-90输出(90),(英⽂逗号)添加分组分隔符,只对定点浮点数整数部分添加分组分隔符,⼩数部分不会添加3,333.33#(对于f 格式)包含⼩数点3,333.#(对于x或o格式)添加前缀0x或00xcafe$指定要格式化的参数索引。例如,%1 d d %1 dx 将以⼗进制和⼗六进制格式打印第1个参数159 9F<<格式化前⾯说明的数值。例如,%d<%x 将以⼗进制和⼗六进制打印同⼀个值159 9F 表2-⽤于printf conversion(转换符) 说明 转换符类型⽰例转换符类型⽰例d⼗进制整数159s字符串hellox⼗六进制整数9fc字符Ho⼋进制整数237b布尔truef定点浮点数1.59e+01h散列码42628b2e指数浮点数tx或Yx⽇期时间(T强制⼤写)已经过时,应当改为使⽤ java.time 类。g通⽤浮点数(e和f中较短的⼀个)——%百分号%a16进制浮点数0x1.fccdp3n与平台有关的换⾏符—— 补充1: 使⽤ s 转换符格式化任意的对象可以使⽤ s 转换符格式化任意的对象。 对于实现了 Formattable 接⼝的任意对象,将调⽤这个对象的 formatTo ⽅法;否则调⽤
toString ⽅法将这个对象转换为字符串。 补充2: String.format() 使⽤ String.format() ⽅法可创建⼀个格式化的字符串,⽽不打印输出。API: public static String format(String format, args) public static String format(Locale l, String format, args) 12 参数和 printf() 中的含义相同。 表3-⽇期和时间的转换符 Note: 以下格式符已经过时,对于新的代码,应当使⽤ java.time 包的⽅法。 eg: System.out.printf("%tc",new Date());这条语句将⽤下⾯的格式打印当前的⽇期和时间: Mon Feb 09 18:05:19 PST 2015 1 下⾯的转换符前⾯都必须⽤ t/T 修饰。 转换符类型⽰例c完整的⽇期和时间Mon Feb 09 18:05:19 PST 2015FISO 8601⽇期
2015/2/9D美国格式的⽇期(⽉/⽇/年)02/09/2015T24⼩时时间18:05:19r12⼩时时间6:05:19R24⼩时时间,没有秒18:05Y4位数字的年(前⾯补02015y年的后两位数字(前⾯补0)15C年的前两位数字(前⾯补0)20B⽉的完整拼写Februaryb或h⽉的缩写Febm 两位数字的⽉(前⾯补0)02d两位数字的⽇(前⾯补0)09e两位数字的⽇(前⾯不补09A星期⼏的完整拼写Mondaya星期⼏的缩写Monj三位数的年中第⼏天(前⾯补0),在001到366之间069H两位数字的⼩时(前⾯补0),在0到23之间18k两位数字的⼩时(前⾯不补0),在0到23之间18I两位数字的⼩时(前⾯补0),在01到12之间06l两位数字的⼩时(前⾯不补0),在1到12之间6M两位数字的分钟(前⾯补0)05S两位数字的秒(前⾯补0)19L三位数字的毫秒(前⾯补0)047N九位数字的毫微秒(前⾯补0)047000000p上午或下午的标志pmz从 GMT 起,RFC 822 数字位移-800Z时区PSTs从格林尼治时间 1970-01-01 00:00:00 起的秒数
大学英语三级词汇表1078884319Q从格林尼治时间 1970-01-01 00:00:00 起的毫秒数1078884319047 从上表可以看到,某些格式只给出了指定⽇期的部分信息。例如,只有⽇期或⽉份。如果需要多次提供⽇期来分别格式化每⼀部分就太笨拙了。为此,可以⽤⼀个格式字符串指⽰要格式化的参数索引。索引必须紧跟在%后⾯,并以$终⽌。例如, System.out.printf("%1$s %2$tB %2$te, %2$tY","Due date:",new
工程结算
Date()); 1 会打印 Due date: February 9, 2015 1 还可以选择使⽤<;标志。它指⽰前⾯格式说明中的参数将被再次使⽤。也就是说,以下语句将产⽣与前⾯语句同样的输出结果: System.out.printf("%1$s %tB %<te, %<tY","Due date:",new Date()); 1 2. args args : 格式字符串中格式说明符引⽤的参数。如果参数多于格式说明符,则忽略额外参数。 参数的数量是可变的,可以为零。 参数的最⼤数量受The Java Virtual Machine Specification(java虚拟机规范)定义的Java数组的最⼤维数限制。 null参数上的⾏为取决于 conversion(转换符) 。 3. locale 数字和⽇期的格式化规则是特定于本地化环境的。 例如,在德国,分组分隔符是点号⽽不是逗号,另外 Monday被格式化为 Montag。locale主要⽤于如何控制应⽤的国际化⾏为。 3.printf 使⽤实例 // +199 199 c7 307 0xc7 0307
nook
System.out.printf("%+d %<d %<x %<o %<#x %<#o\n",199); // | 23| |23| System.out.printf("|% d| |%<d|\n",23); // hello 第5个字符是o,that's true System.out.printf("%s 第%d个字符是%c,that's %b\n","hello",5,'o',true); // 15 % 6 = 3
System.out.printf("%2$d %% %1$d = %3$d\n",6,15, 15 % 6); // | 7.33| |007.33| |7.330000| 0x1.d51eb851eb852p2 System.out.printf("|%6.2f| |%0<6.2f| |%<f| %<a\n",7.33); // | 211.79| |211.79 | System.out.printf("|%7.2f| |%<-
7.2f|\n",211.79); // | -211.79| |(211.79)| |(-211.79)| System.out.printf("|%8.2f| |%<(8.2f| |(%<.2f)|\n",-211.79); // |-21171.3333| |-21,171.3333| |-2.1171e+04| |-2.117e+04| System.out.printf("|%.4f| |%<,.4f| |%<.4e| |%<.4g|\n",-
21171.3333); String str = new String("tree"); // Note: %h 格式符输出对象的散列码 和 调⽤对象的hashCode 得到的值并不相同 // obj %h formatinput: 36739e,hashCode:3568542 System.out.printf("obj %%h formatinput:
quechua
去痘食疗%h,hashCode:%s\n",str,str.hashCode()); // true 25 0.0032 含 System.out.printf("%s %s %s %s\n",true,25,3.2e-3,'含'); System.out.printf("|%n| \n","world"); System.out.printf("|%n| \n"); 12345678910111213141516171819202122232425262728293031323334 输出 +199 199 c7 307 0xc7 0307 | 23| |23| hello 第5个字符是o,that's true 15 % 6 = 3 | 7.33| |007.33| |7.330000| 0x1.d51eb851eb852p2 | 211.79| |211.79 | | -211.79| |(211.79)| |(-211.79)| |-21171.3333| |-21,171.3333| |-2.1171e+04| |-2.117e+04| obj %h formatinput:
36739e,hashCode:3568542 true 25 0.0032 含 | | | | 1234567891011121314 关于 printf 转换符使⽤的注意事项 适⽤于浮点类型转换符(e,g,a,f)不能⽤于整形; 同样适⽤于整形的转换符(d,o,x)不能⽤于浮点型。可以使⽤ s 转换符格式化任意的对象。 对于实现了 Formattable 接⼝的任意对象,将调⽤这个对象的 formatTo ⽅法;否则调⽤ toString ⽅法将这个对象转换为字符串。 eg: // test in jdk 8,11,14 // Exception in thread "main" java.util.IllegalFormatConversionException: o != java.lang.Float
joan osborne
System.out.printf("%o\n",2.3f); // Exception in thread "main" java.util.IllegalFormatConversionException: f !=no
receive是什么意思
java.lang.Integer System.out.printf("%f\n",25); 1234567 (本⽂完)
feelingtouch