如果您不熟悉字符串格式或只想快速解决问题,字符串格式的 Java 文档 并不是最容易阅读和理解的。虽然它很完整,但它不是很用户友好,所以我想我会尝试写一个更清晰的版本。这篇文章既适合您,也适合我自己的回忆录。
有两种方法提供字符串格式化行为:format() 和 printf()。 format()方法是String.class的静态方法,printf()方法是静态的方法系统输出类。它们的行为方式完全相同并且具有相同的签名。
format("format string", argument(s)); printf("format string", argument(s));
“格式字符串” 用于格式化参数列表 中的值。
它可以包含与任何参数无关的字符串文字信息和特定于参数的格式化数据。格式化数据将始终以百分号 (%) 开头,后跟格式化语义。
让我们看一些例子。
让我们从最简单的例子开始。在占位符下方的代码片段中,%s 被替换为名称 Alex。
String.format("Hello %s", "Alex"); // Hello Alex
format() 方法返回一个包含消息 Hello Alex 的字符串。
一次可以替换多个占位符。在下面的示例中,格式化的字符串由一个字符串和一个浮点基元组成。
String.format("The %s costs $%f", "Bag", 12.99f); // The Bag costs $12.990000
请注意该数字如何未格式化为货币的两位小数。接下来让我们看看数字格式。
要将数字格式化为给定的小数位数,请指定 % 占位符字符后的位数,如以下代码片段所示。
String.format("The %s costs $%.2f", "Bag", 12.99f); // The Bag costs $12.99
要添加数字分隔符,请在 % 占位符后添加逗号。
String.format("The %s costs $%,.2f", "Car", 54999.99f); // The Car costs $54,999.99
逗号是特定于语言环境的,因此点 (.) 分隔符将用于使用该字符对数字进行分组的区域。
让我们快速浏览一下其他数字格式设置选项。
使用 ( 字符表示负数应括在括号中。
String.format("Absolute zero is %(.2f degrees Celsius", -273.15f); // Absolute zero is (273.15) degrees Celsius
使用 + 字符来包含正号或负号。
String.format("Temperature of the Sun %,+d K", 5778); // Temperature of the Sun +5,778 K
String.format("Temperature of Jupiter %,+d Celsius", -145); // Temperature of Jupiter -145 Celsius
用 0 标志和指定宽度来填充数字。在下面的代码中,宽度为 10。
String.format("A padded number %010d", 42); // A padded number 0000000042
请注意,零的个数不是 10,而是数字的宽度为 10,数字后的剩余空间用零填充,使数字长为 10 位。
该数字可以显示在左侧并具有给定的宽度。
String.format("A left-justified number <%-10d>", 42); // A left-justified number <42 >
注意左边的空格数不是10,而是数字的宽度是10,数字后面的剩余空间用空格字符填充,使数字字符变长。
显示八进制和十六进制数字有两种格式选项:带前导 0 或 0x 或不带任何前导字符。
String.format("An octal number %o", 100); // An octal number 144 String.format("An octal number %#o", 100); // An octal number 0144
String.format("An hex number %x", 100); // An hex number 64 String.format("An hex number %#X", 100); // An hex number 0X64
请注意最后一个示例中的大写字母 X。 X 的大小写决定了输出数字中 X 的大小写,即小写 x 导致输出数字中的小写 X。
为了总结我到目前为止所讨论的内容,我准备了一张总结标志的表格。这不是一个详尽的列表,因为您必须查阅 Java 文档。
标记 | 描述 | 注释 |
- | 左证明这个论点。 | 不能与垫“0”一起使用。还必须指定宽度。 |
+ | 在此参数中包含一个符号(+ 或 – ) | 只有数字。 d或f。 |
0 | 用零填充此参数。 | 只有数字。还必须指定宽度。 d或f。 |
, | 使用区域特定的分组分隔符(即 123,456 中的逗号) | 只有数字。 d或f。 |
( | 将负数括在括号中 | 只有数字。 d或f。 |
一般、字符和数字类型的格式说明符具有以下语法:
格式字符串:%[arg_index$][flags][width][.precision]转换字符
方括号 [ ] 中的值是可选的,格式字符串唯一必需的元素是百分比字符 % 和转换字符。
为了汇总我谈到的转换字符,我构建了一个汇总表。这不是一个详尽的列表,因为您必须查阅 Java 文档。
转换字符 | 类型 | 注释 |
d | 积分 | 十进制整数 |
o | 积分 | 八进制整数 |
X, X | 积分 | 十六进制整数 |
e, E | 浮点数 | 科学记数法中的十进制数 |
f | 浮点数 | 十进制数 |
t, T | 日期/时间 | 日期时间转换字符前缀 |
% | 百分比 | 文字% |
字符串的格式化方式与数字的格式化方式非常相似,并且会使用许多相同的标志。让我们从查看带有多个参数的格式化字符串开始。
格式化字符串可以包含多个不同类型的参数。以下示例有两个参数:一个是字符串,另一个是整数。
String.format("The %1s has %2d moons", "Saturn", 53); // The Saturn has 53 moons
注意参数的格式。编号是指参数在字符串之后的顺序。例如,%1s 指的是第一个参数,%2d 指的是第二个参数。
字符串可以采用与数字相同的格式。让我们看一些简单的例子:
String.format("Fun with <%10s>", "Java"); // Fun with < Java>
output = String.format("Fun with <%-10s>", "Java"); // Fun with <Java >
output = String.format("Fun with <%.1s>", "Java"); // Fun with <J>
下面是一些结合了标志、宽度、精度和转换字符的复合示例。
System. out.printf( "%2$(+,8d, %1$(+,8d", 1234, -5678); // (5.678), +1.234
System. out.printf( "%2$0+,8d, %1$0+,8d", 1234, -5678); // -005.678, +001.234
System. out.printf( "%2$-+,8d, %1$-+,8d", 1234 ,-5678); // -5.678, +1.234
System. out.printf( "%1$+,8.4f", 12234.678878); // +12.234,6789
字符串格式化是一个复杂的主题,要确保您了解所有详细信息,请参阅 Java 文档。
本文的代码源在我的 GitHub 存储库 中。
我通常会发布有关 Java EE 的帖子。以下是您可能感兴趣的主题的简短列表:
如果您想提升 Java EE 技能,请尝试我的 Lynda.com 视频培训课程。它们涵盖了一系列 Java EE 技术:
标签2: Java教程地址:https://www.cundage.com/article/jcg-format-string-clarified.html