Menu

Java 字符串格式化:String.format、printf 与格式说明符

如何在 Java 中用 String.format 和 printf 格式化字符串:数字、填充、小数位的格式说明符,以及文本块和 formatted 方法。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

两种格式化方式

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。

Coddy 编程语言插图

和 Coddy 一起学编程

开始