用户友好的介绍
如果您不熟悉String格式或只想快速解决问题,那么String格式的Java文档不是最容易阅读和理解的。 尽管它很完整,但它不是非常用户友好的,所以我想我会尝试编写一个更清晰的版本。 这篇文章不仅对您有帮助,而且对我本人来说也很重要。
格式化方法
有两种提供String格式化行为的方法: format()和printf() 。 format()方法是String.class的静态方法,而printf()方法是静态System.out.class的方法。 它们的行为完全相同,并且具有相同的签名。
format("format string", argument(s));
printf("format string", argument(s));
“格式字符串”用于格式化参数列表中的值。
它既可以包含不与任何参数关联的String文字信息,也可以包含特定于参数的格式数据。 格式化数据将始终以百分号( % )开头,后跟格式化语义。
让我们看一些例子。
替换字符串中的占位符
让我们从最简单的示例开始。 在占位符下方的代码段中, %s被替换为名称Alex 。
String.format("Hello %s", "Alex");
// Hello Alex
format()方法返回一个字符串,其中包含消息Hello Alex 。
多占位符
一次可以替换多个占位符。 在下面的示例中,格式化的String由String和浮点基元组成。
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 | 积分 | 小数整数 |
Ø | 积分 | 八进制整数 |
x,X | 积分 | 十六进制整数 |
e,E | 浮点 | 科学计数法中的小数 |
F | 浮点 | 小数 |
, | 约会时间 | 日期和时间转换字符的前缀 |
% | 百分 | 文字百分比 |
如何格式化字符串
字符串的格式与数字的格式几乎相同,并且将使用许多相同的标志。 让我们开始看一个用几个参数格式化的字符串。
多个参数
格式化的字符串可以包含多个不同类型的参数。 以下示例有两个参数:一个是字符串,另一个是整数。
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
- (在负数附近显示花括号
- +显示+表示正数
- ,使用本地号码格式
- 8最小宽度8
- d位
System. out.printf( "%2$0+,8d, %1$0+,8d", 1234, -5678);
// -005.678, +001.234
- 0用0填充空间
System. out.printf( "%2$-+,8d, %1$-+,8d", 1234 ,-5678);
// -5.678, +1.234
- –左对齐
System. out.printf( "%1$+,8.4f", 12234.678878);
// +12.234,6789
- +显示+表示正数
- ,使用本地号码格式
- 8最小宽度8
- .4点后的位数,四舍五入
- f浮动
结论
字符串格式化是一个复杂的主题,为确保您了解所有详细信息,请参阅Java文档 。
代码源
本文的代码源位于我的GitHub存储库中 。
进一步阅读
我通常会发布有关Java EE的帖子。 以下是您可能感兴趣的主题的简短列表:
- Java EE:过去,现在和未来
- 上下文和依赖注入 (CDI)
- 企业Java Bean (EJB)
- 什么是JAX-RS批注?
- @Context注释用于什么?
学到更多
如果您想提高Java EE技能,请尝试我的Lynda.com视频培训课程。 它们涵盖了多种Java EE技术:
- 使用JAX-RS 2.0的RESTful服务
- 使用Java EE进行WebSocket编程
- 使用Java EE和JSON处理
- 学习Java企业版
翻译自: https://www.javacodegeeks.com/2017/09/format-string-clarified.html