好的,我们来详细讲解 Java 中 String.format() 方法的完整用法。这是一个非常强大的工具,用于创建格式化的字符串,其功能类似于 C 语言中的 printf 函数。
String.format() 方法的基本语法是:
String formattedString = String.format(String format, Object... args);
format:这是一个包含格式说明符的字符串。args:这是一个可变参数列表,包含零个或多个对象,这些对象将被插入到格式字符串中。
核心:格式说明符
格式说明符决定了如何格式化参数。其一般语法如下:
%[argument_index$][flags][width][.precision]conversion
%:必需,表示格式说明符的开始。argument_index$(可选):指定使用参数列表中的第几个参数(索引从 1 开始)。例如1$表示第一个参数,2$表示第二个参数。如果不指定,则按顺序使用参数。flags(可选):提供额外的格式化选项。常见的标志有:-:在指定的宽度内左对齐(默认是右对齐)。+:为数值输出符号(+或-)。0:用零填充数值以达到指定宽度。,:使用特定于语言环境的千位分隔符(例如1,234)。(:将负数括在括号内。- (空格):在正数前加空格,负数前加负号(
-)。
width(可选):一个整数,指定输出字段的最小宽度。如果输出的内容比宽度短,则用空格(或0,如果指定了0标志)填充以达到该宽度。.precision(可选):对于浮点数,指定小数点后的精度位数。对于字符串,指定输出的最大字符数。以.开头后跟一个整数。conversion(必需):指定参数应如何格式化。这是一个字符,告诉方法参数是什么类型以及如何显示它。常见的转换字符有:s:字符串(或任何对象,调用其toString()方法)。d:十进制整数。f:十进制浮点数。e,E:科学计数法表示的浮点数。g,G:根据精度和值,可能使用f或e/E格式。c:字符。b,B:布尔值(true或false)。h,H:参数的哈希码(十六进制字符串)。%:输出一个百分号%。n:特定于平台的换行符(相当于System.lineSeparator())。t,T:日期/时间转换(需要额外的后缀字符,如tA表示星期几的全名)。
详细用法与示例
-
基本格式化(字符串、整数、浮点数)
String name = "Alice"; int age = 30; double height = 1.75; String str1 = String.format("Name: %s, Age: %d, Height: %.2f meters", name, age, height); // 结果: "Name: Alice, Age: 30, Height: 1.75 meters" -
指定宽度和填充
int num = 42; String str2 = String.format("|%5d|", num); // 右对齐,宽度5: "| 42|" String str3 = String.format("|%-5d|", num); // 左对齐,宽度5: "|42 |" String str4 = String.format("|%05d|", num); // 右对齐,宽度5,用0填充: "|00042|" -
精度控制(浮点数、字符串)
double pi = Math.PI; String str5 = String.format("Pi: %.4f", pi); // "Pi: 3.1416" String str6 = String.format("Pi: %10.4f", pi); // 宽度10,精度4: "Pi: 3.1416" String longStr = "HelloWorld"; String str7 = String.format("First 5 chars: %.5s", longStr); // "First 5 chars: Hello" -
标志(逗号分隔、符号)
int bigNumber = 1234567; double negative = -123.456; String str8 = String.format("With commas: %,d", bigNumber); // "With commas: 1,234,567" String str9 = String.format("Always show sign: %+d", 10); // "Always show sign: +10" String str10 = String.format("Negative in paren: %(d", negative); // "Negative in paren: (123)" -
参数索引(重用参数、改变顺序)
String str11 = String.format("Name: %1$s, Age: %2$d. Again, Name: %1$s", name, age); // 结果: "Name: Alice, Age: 30. Again, Name: Alice" String str12 = String.format("Age: %2$d, Name: %1$s", name, age); // 结果: "Age: 30, Name: Alice" -
布尔值、字符、哈希码
boolean flag = true; char ch = 'X'; String str13 = String.format("Flag: %b", flag); // "Flag: true" String str14 = String.format("Character: %c", ch); // "Character: X" String str15 = String.format("Hash of 'Hello': %h", "Hello"); // "Hash of 'Hello': 42628b2" -
格式化日期和时间 (使用
t或T转换)日期时间格式化需要额外的后缀字符。通常结合
java.util.Date或java.time类使用。import java.util.Date; Date now = new Date(); String str16 = String.format("Current date: %tF", now); // "Current date: 2023-10-27" (ISO 8601) String str17 = String.format("Time: %tT", now); // "Time: 14:30:15" (HH:MM:SS) String str18 = String.format("Day of week: %tA", now); // "Day of week: Friday"注意:对于新的日期时间 API (
java.time),通常使用其自带的格式化方法(如DateTimeFormatter),但String.format也能处理LocalDateTime等类型。 -
科学计数法
double avogadro = 6.02214076e23; String str19 = String.format("Avogadro's number: %e", avogadro); // "Avogadro's number: 6.022141e+23" String str20 = String.format("Avogadro's number: %E", avogadro); // "Avogadro's number: 6.022141E+23" String str21 = String.format("Avogadro's number: %g", avogadro); // "Avogadro's number: 6.02214e+23" (更紧凑) -
货币格式化 (结合
Locale和%f/%,.2f)要格式化货币,通常需要指定
Locale并使用%,.2f来获得千位分隔符和两位小数,然后手动添加货币符号,或者使用NumberFormat类。double amount = 1234.56; String str22 = String.format("Amount: $%,.2f", amount); // US: "Amount: $1,234.56" String str23 = String.format(Locale.GERMANY, "Amount: %,.2f €", amount); // Germany: "Amount: 1.234,56 €" -
换行符和字面量
%String str24 = String.format("Line 1%nLine 2"); // 跨平台换行 String str25 = String.format("Discount: 20%% off!"); // "Discount: 20% off!"
注意事项
- 类型匹配:确保传递给格式说明符的参数类型与该说明符的转换字符兼容(例如,
%d对应整数,%f对应浮点数)。类型不匹配会导致IllegalFormatException。 - 参数数量:提供的参数数量必须满足格式字符串中所有非忽略的格式说明符(除了
%%和%n)的需求。否则会导致MissingFormatArgumentException。 printf方法:System.out.printf(String format, Object... args)方法的功能与String.format()完全相同,只是它直接将结果打印到标准输出流,而不是返回一个字符串。- 性能:对于简单的字符串连接(如
"Name: " + name),使用+操作符通常更高效。String.format()在需要复杂格式化时非常有用。 - 国际化:格式化数字(千位分隔符、小数点)和日期时,
String.format()的行为依赖于 JVM 的默认Locale。你可以通过String.format(Locale locale, String format, Object... args)指定特定的语言环境。
总结
String.format() 是 Java 中构建格式良好字符串的利器。通过熟练掌握格式说明符的各个组成部分(%、索引、标志、宽度、精度、转换字符),你可以精确控制数字、字符串、日期等各种类型数据的输出格式,满足日志记录、报表生成、用户界面显示等多种需求。

465

被折叠的 条评论
为什么被折叠?



