共计 3658 个字符,预计需要花费 10 分钟才能阅读完成。
格式化数字打印输出
之前你已经看到使用 print 和 println 方法将字符串打印到标准输出(System.out),由于所有数字都可以转换为字符串(你将在本课后面看到),你可以使用这些方法打印出任意的字符串和数字混合,但是,Java 编程语言还有其他方法,可以在包含数字时对打印输出进行更多控制。
printf 和 format 方法
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(“The value of ” + “the float variable is ” +
“%f, while the value of the ” + “integer variable is %d, ” +
“and the string is %s”, floatVar, intVar, stringVar);
第一个参数 format 是一个格式字符串,指定如何格式化第二个参数 args 中的对象,格式字符串包含纯文本和格式说明符,它们是格式化 Object… args 参数的特殊字符(符号 Object… args 称为可变参数,这意味着参数的数量可能会有所不同)。
格式说明符以百分号(%)开头,以转换器结束,转换器是一个字符,指示要格式化的参数类型,在百分号(%)和转换器之间,你可以使用可选的标志和说明符,java.util.Formatter 中记录了许多转换器、标志和说明符。
这是一个基本的例子:
int i = 461012;
System.out.format(“The value of i is: %d%n”, i);
%d 指定单个变量是十进制整数,%n 是与平台无关的换行符,输出是:
The value of i is: 461012
printf 和 format 方法有重载方法,每个都有一个版本,其语法如下:
public PrintStream format(Locale l, String format, Object… args)
例如,要在法语系统中打印数字(使用逗号代替浮点数的英文表示中的小数位),你将使用:
System.out.format(Locale.FRANCE,
“The value of the float ” + “variable is %f, while the ” +
“value of the integer variable ” + “is %d, and the string is %s%n”,
floatVar, intVar, stringVar);
一个例子
下表列出了表格后面的示例程序 TestFormat.java 中使用的一些转换器和标志。
转换器
标志
说明
d
十进制整数
f
浮点数
n
适合于运行应用程序的平台的新行字符,你应该始终使用%n,而不是 \n
tB
日期和时间转换 — 特定于语言环境的月份全名
td, te
日期和时间转换 — 2 位数的月日,td 根据需要有前导零,te 没有
ty, tY
日期和时间转换 — ty = 2 位数年份,tY = 4 位数年份
tl
日期和时间转换 — 12 小时制
tM
日期和时间转换 — 2 位数分钟,必要时带前导零
tp
日期和时间转换 — 特定于语言环境的 am/pm(小写)
tm
日期和时间转换 — 2 位数的月份,必要时带有前导零
tD
日期和时间转换 — 日期为%tm%td%ty
08
宽度为八个字符,必要时带前导零
+
包括正负号
,
包含特定于语言环境的分组字符
–
左对齐..
.3
小数点后三位
10.3
宽度为十个字符,右对齐,小数点后三位
以下程序显示了你可以使用格式进行的一些格式化,输出显示在嵌入注释中的双引号内:
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 方法的基础知识
DecimalFormat 类
你可以使用 java.text.DecimalFormat 类来控制前导和尾随零、前缀和后缀、分组(千)分隔符和小数分隔符的显示,DecimalFormat 在数字格式化方面提供了极大的灵活性,但它使你的代码更复杂。
下面的示例通过将模式字符串传递给 DecimalFormat 构造函数来创建 DecimalFormat 对象 myFormatter。然后,myFormatter 会调用 DecimalFormat 从 NumberFormat 继承的 format() 方法 — 它接受 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
模式中的第一个字符是美元符号($),请注意,它紧接在格式化输出中最左边的数字之前。
上一篇:数字