本教程针对JDK 8编写。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言更改以了解Java SE 9及其后续版本中更新的语言特性的摘要。
请参阅JDK发行说明以获取有关所有JDK版本的新功能、增强功能和已删除或弃用选项的信息。
之前你看到了使用print和println方法将字符串打印到标准输出(System.out)。由于所有的数字都可以转换为字符串(后面你会看到),所以你可以使用这些方法来打印任意混合的字符串和数字。然而,Java编程语言还有其他方法,允许你在包含数字的打印输出中更加精确地控制输出。
java.io包中包含一个PrintStream类,该类有两个格式化方法,可以用来替代print和println。这两个方法,format和printf,是等效的。你之前使用的熟悉的System.out实际上是一个PrintStream对象,因此你可以在System.out上调用PrintStream方法。因此,在之前使用print或println的任何代码中,你都可以使用format或printf。例如:
System.out.format(.....);
这两个java.io.PrintStream 方法的语法相同:
public PrintStream format(String format, Object... args)
其中,format是一个字符串,指定要使用的格式,args是要使用该格式打印的变量列表。一个简单的例子是:
System.out.format("浮点变量的值是 " +
"%f,整数变量的值是 %d," +
"字符串的值是 %s", floatVar, intVar, stringVar);
第一个参数format是一个格式字符串,指定如何格式化第二个参数args中的对象。格式字符串包含普通文本和格式说明符,格式说明符是特殊字符,用于格式化Object... args的参数。(符号Object... args被称为可变参数,表示参数的数量可以变化。)
格式说明符以百分号(%)开头,以转换符结尾。转换符是一个字符,表示要格式化的参数类型。在百分号(%)和转换符之间,你可以有可选的标志和说明符。有许多转换符、标志和说明符,这些都在java.util.Formatter 中有详细的文档。
这里是一个基本的例子:
int i = 461012;
System.out.format("i的值是:%d%n", i);
%d指定单个变量为十进制整数。 %n是一个平台无关的换行符。输出为:
i的值为:461012
printf和format方法都有重载。每个方法都有以下语法的版本:
public PrintStream format(Locale l, String format, Object... args)
例如,要在法国系统中打印数字(在英文表示的浮点数中,使用逗号代替小数点),您可以使用以下代码:
System.out.format(Locale.FRANCE,
"float变量的值为%f,整数变量的值为%d,字符串的值为%s%n",
floatVar, intVar, stringVar);
以下表格列出了示例程序TestFormat.java中使用的一些转换器和标志。
| 转换器 | 标志 | 解释 |
|---|---|---|
| d | 十进制整数。 | |
| f | 浮点数。 | |
| n | 适用于运行应用程序的平台的换行符。您应该始终使用%n,而不是\n。 |
|
| tB | 日期和时间转换-本地特定的月份全名。 | |
| td, te | 日期和时间转换-两位数的日期。td需要前导零,te不需要。 | |
| ty, tY | 日期和时间转换-ty =两位数年份,tY =四位数年份。 | |
| tl | 日期和时间转换-12小时制中的小时。 | |
| tM | 日期和时间转换-2位数分钟,必要时前面带有前导零。 | |
| tp | 日期和时间转换-本地特定的上午/下午(小写)。 | |
| tm | 日期和时间转换-两位数月份,必要时前面带有前导零。 | |
| tD | 日期和时间转换-日期为%tm%td%ty | |
| 08 | 宽度为8个字符,必要时前面带有前导零。 | |
| + | 包括符号,无论是正数还是负数。 | |
| , | 包括本地特定的分组字符。 | |
| - | 左对齐。 | |
| .3 | 小数点后三位。 | |
| 10.3 | 宽度为10个字符,右对齐,小数点后三位。 |
下面的程序展示了您可以使用format来进行一些格式化的操作。输出结果在嵌入的注释中用双引号表示:
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); // --> "May 29, 2006"
System.out.format("%tl:%tM %tp%n", c, c, c); // --> "2:34 am"
System.out.format("%tD%n", c); // --> "05/29/06"
}
}
format和printf方法的基本知识。更多细节可在 Essential 部分的Basic I/O 页面中找到。
String.format创建字符串的方法在字符串中有介绍。
您可以使用java.text.DecimalFormat 类来控制前导零、后缀、分组(千位)分隔符和小数点分隔符的显示。 DecimalFormat在数字格式化方面提供了很大的灵活性,但可能会使您的代码更复杂。
下面的示例通过将模式字符串传递给DecimalFormat构造函数来创建一个DecimalFormat对象myFormatter。然后,DecimalFormat继承自NumberFormat的format()方法被myFormatter调用—它接受一个double值作为参数,并返回一个格式化后的数字字符串:
这是一个演示使用DecimalFormat的示例程序:
import java.text.*;
public class DecimalFormatDemo {
static public void customFormat(String pattern, double value ) {
DecimalFormat myFormatter = new DecimalFormat(pattern);
String output = myFormatter.format(value);
System.out.println(value + " " + pattern + " " + output);
}
static public void main(String[] args) {
customFormat("###,###.###", 123456.789);
customFormat("###.##", 123456.789);
customFormat("000000.000", 123.78);
customFormat("$###,###.###", 12345.67);
}
}
输出结果如下:
123456.789 ###,###.### 123,456.789 123456.789 ###.## 123456.79 123.78 000000.000 000123.780 12345.67 $###,###.### $12,345.67
以下表格解释了每行输出。
| 值 | 模式 | 输出 | 解释 |
|---|---|---|---|
| 123456.789 | ###,###.### | 123,456.789 | 井号(#)表示数字,逗号是分组分隔符的占位符,句点是小数点的占位符。 |
| 123456.789 | ###.## | 123456.79 | 数值小数点右边有三个数字,但模式只有两个。format方法会通过四舍五入来处理这个情况。 |
| 123.78 | 000000.000 | 000123.780 | 模式指定了前导和尾随零,因为使用了0字符而不是井号(#)。 |
| 12345.67 | $###,###.### | $12,345.67 | 模式中的第一个字符是美元符号($)。注意它紧跟在格式化输出的最左边的数字之前。 |