Java 格式化与 printf( ) 和 String.format( )
Java 输出格式化的必备指南
介绍
Java 提供了强大而灵活的工具来格式化输出。无论您是在打印数值、字符串,甚至日期和时间,printf( ) 方法及其姊妹方法 String.format( ) 都提供了多种选项来控制输出的显示效果。本文讲解了 Java 格式化系统的基础知识 —— 包括格式字符串、flags、width、precision 以及 conversion characters —— 并通过示例和一个示例程序展示如何使用这些功能。
printf( ) 方法概述
在 Java 中,System.out.printf( ) 方法将格式化的字符串写入控制台。最简单的用法如下:
1 |
System.out.printf("String and format – string", arg1, arg2, …); |
该方法的关键在于格式字符串及其随附的参数。格式字符串既包含字面字符,也包含指示如何格式化各个参数的格式说明符。
理解格式字符串
Java 中的格式字符串由两部分主要组成:
- 字面字符 – 这些字符将按原样打印。
- 格式说明符 – 这些说明符定义了传入参数的数据值的格式。
每个格式说明符遵循以下通用顺序:
1 |
% {flags} {width} {.precision} conversion-character |
(注意:大括号内的项目为可选参数。)
格式说明符的组成部分
-
标志:
标志用于定制输出,常用的有:
• - : 左对齐输出,而不是默认的右对齐。
• + : 对正数包含加号(正数总会显示加或减号)。
• 0 : 用零填充数值而非空格。
• , : 使用逗号作为分组分隔符(适用于大于 1000 的数字)。
• (空格) : 在正数前显示空格,或在负数前显示负号。 -
宽度:
宽度说明符设置了要打印的最小字符数。此字段决定了为每个输出值分配的空间。在格式化数值时,请注意考虑额外的字符(例如逗号或小数点)。 -
精度:
精度根据转换类型的不同具有不同的作用。对于浮点数,它设置小数点后显示的位数;对于字符串,则可以限制打印的字符数。在这两种情况下,数值可能会根据指定的精度进行四舍五入。 -
转换字符:
转换字符用于确定数据类型的格式。示例包括:
• d : 十进制整数(适用于 byte, short, int 和 long)
• f : 浮点数(适用于 float 和 double)
• c : 字符(大写 C 会把字符转换为大写)
• s : 字符串(大写 S 会将整个字符串转换为大写)
• h : 哈希码(用于打印对象的引用值)
• n : 换行符(平台特定的换行字符;为保证跨平台性,总是使用 %n 而非 \n)
例如,考虑下面两个使用存储在 dblTotal 中的浮点值的打印语句:
1 2 |
System.out.printf("Total is: $%,.2f%n", dblTotal); System.out.printf("Total: %-10.2f", dblTotal); |
使用 String.format( )
与 System.out.printf( ) 类似,String.format( ) 方法允许您创建一个可以赋值给变量的格式化字符串。用法与 printf( ) 完全相同。例如:
1 |
String grandTotal = String.format("Grand Total: %,.2f", dblTotal); |
当您需要存储或进一步操作格式化字符串而不是立即打印它们时,这个功能尤其有用。
日期和时间的额外格式说明符
Java 的格式化机制还支持日期和时间的转换说明符。以下是一些示例:
- tB – 与区域设置相关的月份全名。
- td 或 te – 月中的天数(td 在必要时包含前导零,而 te 则不包含)。
- ty 或 tY – 年份(ty 提供两位数字的年份,而 tY 提供四位数字的年份)。
- tl – 12 小时制的小时数。
- tM – 以两位数字表示的分钟数(在需要时添加前导零)。
- tp – 与区域设置相关的 am/pm 标记(小写)。
- tm – 以两位数字表示的月份。
- tD – 日期格式化为 %tm%td%ty(例如,”05/29/06″)。
其他重要的格式构造包括:
• + : 始终包含符号(正或负)。
• , : 插入与区域设置相关的分组分隔符。
• - : 将格式化输出左对齐。
• .3 : 在小数点后显示三位数字。
• 10.3 : 分配一个宽度为十个字符的字段,默认右对齐,并在小数点后显示三位数字。
示例程序
为了将所有这些概念结合起来,请参考下面这个示例 Java 程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import java.util.Calendar; import java.util.Locale; public class TestFormat { public static void main(String[] args) { long n = 461012; System.out.format("%d%n", n); // --> "461012" System.out.format("%08d%n", n); // --> "00461012" System.out.format("%+8d%n", n); // --> " +461012" System.out.format("%,8d%n", n); // --> " 461,012" System.out.format("%+,8d%n%n", n); // --> "+461,012" double pi = Math.PI; System.out.format("%f%n", pi); // --> "3.141593" System.out.format("%.3f%n", pi); // --> "3.142" System.out.format("%10.3f%n", pi); // --> " 3.142" System.out.format("%-10.3f%n", pi); // --> "3.142 " System.out.format(Locale.FRANCE, "%-10.4f%n%n", pi); // --> "3,1416" Calendar c = Calendar.getInstance(); System.out.format("%tB %te, %tY%n", c, c, c); // e.g., "May 29, 2006" System.out.format("%tl:%tM %tp%n", c, c, c); // e.g., "2:34 am" System.out.format("%tD%n", c); // e.g., "05/29/06" } } |
注意:在程序代码中,所有的 “<” 和 “>” 均已被替换为 “<" 和 ">“。
程序亮点
- 数值格式化展示了零填充和逗号分组。
- 浮点数格式化展示了精度控制和使用字段宽度进行对齐。
- 日期和时间格式化利用转换字符生成与区域设置相关的输出。
- 通过切换区域设置(例如使用 Locale.FRANCE),您可以控制小数点等细节。
结论
Java 的 printf( ) 和 String.format( ) 方法为开发人员提供了广泛的控制,能够决定数据的展示方式。从简单的数字格式化到更复杂的日期和时间转换,这些格式化工具对于创建精致、易读的控制台输出至关重要。通过掌握 flags、width、precision 和 conversion characters,您可以调整输出以满足功能性和美观性的要求。借助众多内置的说明符和选项,Java 的格式化功能帮助简化生成清晰且有效的用户界面或日志的过程。
祝您愉快地使用 Java 强大的格式化功能编程!
注意:本文由 AI 生成。