Java String format() 方法

定义和用法

format() 方法使用区域设置、格式和附加参数返回一个格式化的字符串。

如果未向此方法传递区域设置,则使用 Locale.getDefault() 提供的区域设置。

附加参数中的数据会被格式化并写入格式字符串中的占位符,这些占位符由 % 符号标记。参数的格式化方式取决于 % 符号后面的字符序列。

占位符

占位符的形式为:

%[arg$][flags][width][.precision]conversion

注释:[方括号]中的组件是可选的。

以下是每个组件的解释:

arg$ - 可选。数字后跟 $ 符号,指示要使用哪个附加参数,参数编号从 1 开始。这可以用 < 替换,表示应使用前一个占位符中的参数。

flags - 可选。以下字符中的任何一个的序列:

  • - - 通过在右侧而不是左侧添加填充空格,使输出左对齐。
  • # - 根据转换方式显示格式化数据的另一种表示形式。
  • + - 使正数始终带有 "+" 前缀。
  • - (空格字符)这会在正数前加上一个空格,主要是为了使正数的数字能够与负数的数字对齐。
  • 0 - 在数字左侧用零进行填充。
  • , - 将数字分组(例如,按千位分组),并在各组之间放置分隔符。这受区域设置的影响。
  • ( - 将负数用括号括起来。

width - 可选。整数,指定输出应占用的最小字符数。如果需要,将在右侧添加空格以达到此数字,如果使用了 "-" 标志,则在左侧添加空格。

.precision 可选。点(.)后跟整数,表示在格式化数据中显示多少位小数。

conversion - 必需。字符,指示应如何表示参数的数据。如果该字符是大写,则数据将尽可能以大写格式表示。可能的字符列表如下表所示。

转换列表

字符 转换 描述
% 百分号 在输出中显示一个字面的 "%" 字符。
n 换行符 在输出中显示一个换行符。
bB 布尔值

将参数的布尔值显示为 "true" 或 "false"。

如果使用 "B",则显示为 "TRUE" 或 "FALSE"。

hH 无符号十六进制整数

将参数的二进制数据表示为无符号十六进制整数。

如果使用 "H",则数字 A 到 F 以大写显示。

注意:对于除正整数以外的任何数据,这并不表示其真实值。

sS 字符串

显示参数的默认字符串表示形式。

如果使用 "S",则字符串将尽可能转换为大写。

cC Unicode 字符

显示参数的 Unicode 字符表示形式。对于整数,这是与数字对应的 Unicode 字符。

如果使用 "C",则字符将尽可能转换为大写。

d 十进制整数 将整数表示为十进制整数。
o 八进制整数 将整数表示为八进制整数。"#" 标志将在数字前加上 "0"。
xX 十六进制整数

将整数表示为十六进制整数。"#" 标志将在数字前加上 "0x"。

如果使用 "X",则数字 A 到 F 和字母 X 以大写显示。

eE 科学计数法

将浮点数表示为科学计数法。如果使用 "E",则表示的 "E" 字母将为大写。

"#" 标志将强制显示小数点,即使没有小数位数。

f 浮点数 表示浮点数。"#" 标志将强制显示小数点,即使没有小数位数。
gG 通用数字 对于浮点数,显示 f 和 e 或 E 之间的最短表示。
aA 十六进制浮点数 用十六进制数字显示浮点数的内部表示。
tT 时间或日期

显示格式化的日期或时间。t 或 T 后面必须跟一个字符,指示应如何格式化日期或时间。

如果使用 "T",则日期的文本部分(如 "JANUARY")将为大写。

以下字符可用于日期和时间格式化:

  • H - 小时的 24 小时格式(00 至 23)
  • I - 12 小时制的小时(01 至 12)
  • k - 24 小时制的小时(0 至 23)
  • l(小写 'L')- 12 小时制的小时(1 至 12)
  • M - 带前导零的分钟(00 至 59)
  • S - 带前导零的秒(00 至 59)(闰秒可能出现值 60)
  • L - 带前导零的毫秒(000 至 999)
  • N - 带前导零的纳秒(000000000 至 999999999)
  • p - "am"、"pm"、"AM" 或 "PM",指示上午或下午
  • z - 与格林威治时间的差异(例如:-0800)
  • Z - 时区缩写(例如:EST、MDT)
  • s - 自 Unix 纪元(1970 年 1 月 1 日 00:00:00 GMT)以来的秒数
  • Q - 自 Unix 纪元(1970 年 1 月 1 日 00:00:00 GMT)以来的毫秒数
  • B - 月份的完整文本表示(一月到十二月)
  • b 或 h - 月份的简短文本表示(三个字母)
  • A - 星期几的完整文本表示(例如:Monday)
  • a - 星期几的简短文本表示(例如:Mon)
  • C - 年份的前两位数字(对于 1970 年,将显示 "19")
  • Y - 年份的四位数表示
  • y - 年份的两位数表示
  • j - 带前导零的年份中的天数(001 至 366)
  • m - 月份的数字表示(01 至 12)
  • d - 月份中的天数(01 至 31)
  • e - 不带前导零的月份中的天数(1 至 31)
  • R - 24 小时制的时间(例如:21:30)
  • T - 带秒的 24 小时制时间(例如:21:30:02)
  • r - 带秒的 12 小时制时间(例如:09:30:02 PM)("AM" 和 "PM" 总是大写)
  • D - 日期表示为月/日/年(例如:12/17/23)
  • F - 日期表示为年-月-日(例如:2023-12-17)
  • c - 完整的日期和时间(例如:Thu Mar 28 10:51:00 EDT 2024)

实例

例子 1

返回一个格式化的字符串:

String myStr = "Hello %s! One kilobyte is %,d bytes.";
String result = String.format(myStr, "World", 1024);
System.out.println(result);

亲自试一试

例子 2

使用一个包含所有组件的占位符:

String result = String.format("%2$,3.2f %1$s", "meters", 1260.5052);
System.out.println(result);

亲自试一试

这是占位符 %2$,3.2f 各部分的工作方式:

  • 2$ 表示使用第二个参数的值
  • , 表示数字应分组(通常按千位)
  • 3 表示数据的表示形式应至少为 3 个字符长
  • .2 表示小数点后应有两位数字
  • f 表示数据被表示为浮点数

例子 3

以不同的顺序使用参数:

String result = String.format("%3$c %2$c %1$c", 'a', 'b', 'c');
System.out.println(result);

亲自试一试

例子 4

格式化一个浮点数:

double myNumber = 123456.78;
String result;

// 默认
result = String.format("%f", myNumber);
System.out.println(result);

// 两位小数
result = String.format("%.2f", myNumber);
System.out.println(result);

// 无小数位数
result = String.format("%.0f", myNumber);
System.out.println(result);

// 无小数位数但保留小数点
result = String.format("%#.0f", myNumber);
System.out.println(result);

// 分组数字
result = String.format("%,.2f", myNumber);
System.out.println(result);

// 科学计数法,保留两位小数
result = String.format("%.2e", myNumber);
System.out.println(result);

亲自试一试

例子 5

用 Unix 时间戳格式化日期:

long date = 1711638903488L; // Unix 时间戳(自 1970 年 1 月 1 日以来的毫秒数)
String result;

//  时间
result = String.format("%tl:%<tM %<tp", date);
System.out.println(result);

// 月份和日期
result = String.format("%tB %<te", date);
System.out.println(result);

// 完整的日期表示
result = String.format("%tc", date);
System.out.println(result);

亲自试一试

例子 6

通过 Unicode 码点表示字符:

String result;

// 通过 Unicode 码点表示字符
result = String.format("%c%c%c%c%c", 72, 101, 108, 108, 111);
System.out.println(result);

// 强制将 Unicode 字符转换为大写
result = String.format("%C%C%C%C%C", 72, 101, 108, 108, 111);
System.out.println(result);

亲自试一试

语法

其中之一:

public static String format(Locale locale, String format, Object... args)
public static String format(String format, Object... args)

参数

参数 描述
locale 可选。用于确定某些格式设置(例如,用于小数点和分组分隔符的字符)的区域设置。
format 必需。将被返回的字符串,其中可以包含占位符,用于指示如何格式化其他参数。
args 可选。传递给方法的任意数量的附加参数,它们的值可以被格式化并显示在返回的字符串中。

技术细节

返回: 使用指定的区域设置、格式和参数格式化后的 String 值。
抛出:

IllegalFormatException

  • 如果格式字符串包含无效的占位符
  • 或者占位符与参数的数据类型不兼容
Java 版本: 1.5