两种格式化方式
Java 根据一个模板来格式化字符串,模板中包含格式说明符(以 % 开头的占位符),再加上要填进去的值。有两个入口,它们的语法完全相同:
String.format(template, values...)返回一个新的String。System.out.printf(template, values...)直接打印结果。
两者产生的文本相同。String.format 把文本交回给你,方便存储;printf 把它写到控制台。注意 printf 模板末尾的 %n:它是与平台无关的换行符(在格式字符串中优先用它,而不是 \n)。
常用的说明符
每个说明符都以 % 开头,以一个表示值的类型的字母结尾:
日常最常用的三个是 %s(任何值,通过它的 toString)、%d(整数)和 %f(小数)。用 %% 打印一个字面意义上的百分号。传入错误的类型,比如把 String 传给 %d,会在运行时抛出一个 IllegalFormatConversionException。
控制小数位数
%f 默认保留六位小数,这很少是你想要的。在 f 前面加上 .N 来固定精度(数值会被四舍五入):
给大数字加上逗号标志,就能显示分组分隔符:
宽度与填充
在 % 和类型字母之间放一个数字,可以设置最小字段宽度,并用空格填充,让各列对齐。前面加 - 表示左对齐;前面加 0 表示用零填充数字:
正是这一点让格式化的表格和对齐的报表清晰易读,尤其是在 for 循环中逐行打印时:
%-8s 让名字在 8 个字符宽的列中左对齐,%5d 让分数在 5 个字符宽的列中右对齐,所以无论有几位数字,数字都能对齐。
参数顺序
默认情况下,说明符从左到右依次使用值。你可以用 N$(从 1 开始的索引)重复使用或调整某个值的顺序,同一个值出现两次时很方便:
%1$s 两次都引用第一个参数,所以 echo 被打印了两次。
formatted() 方法
从 Java 15 开始,每个字符串都有一个 formatted 实例方法:它和 String.format 使用同一套机制,只是写成在模板上调用的方法:
在构建较长的格式化输出时,它和文本块(用三引号括起来的多行字符串)搭配起来尤其好用。
什么时候不该用 String.format
对于简单的一次性拼接,用 + 直接连接更清楚,也更快:
String greeting = "Hi, " + name + "!"; // simpler than String.format here
当你需要真正的格式化时,比如固定小数位数、填充、对齐、分组,才用 String.format / printf,而不是只为了把几个值粘在一起。
下一页:运算符
格式化把值变成文本。而要先把这些值计算出来,你需要 Java 的运算符:算术、比较和逻辑运算符。这就是下一页的内容。
常见问题
Java 中如何格式化字符串?
用 String.format(template, values...),它返回一个新字符串,其中每个格式说明符都被替换成一个值:String.format("%s is %d", name, age)。如果想直接打印而不是构建字符串,就用同样的模板调用 System.out.printf(...)。从 Java 15 开始,你还可以调用 template.formatted(values...)。
Java 中如何把数字格式化为两位小数?
使用 %.2f 说明符:String.format("%.2f", 3.14159) 得到 "3.14"。小数点后的数字表示保留几位小数,数值会被四舍五入。要加千位分隔符,就加上逗号标志:%,.2f 得到 "1,234.57"。
Java 中 String.format 和 printf 有什么区别?
它们使用完全相同的格式说明符。String.format(...) 把格式化后的文本作为一个新的 String 返回,你可以把它存起来或者传给别处。System.out.printf(...) 则把格式化后的文本直接写到标准输出,不返回任何有用的东西。构建字符串用 String.format,打印字符串用 printf。