格式化数字打印输出
之前你已经看到使用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,而不是 | |
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 | 模式中的第一个字符是美元符号($),请注意,它紧接在格式化输出中最左边的数字之前。 |
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/72890.html
Java™ 教程 Java教程是为JDK 8编写的,本页面中描述的示例和实践没有利用在后续版本中引入的改进。 Java教程是希望使用Java编程语言创建应用程序的程序员的实用指南,其中包括数百个完整的工作示例和数十个课程,相关课程组被组织成教程。 覆盖基础知识的路径 这些教程以书籍的形式提供,如Java教程,第六版,前往Amazon.com购买。 入门 介绍Java技术和安装Java开发软件并使用...
字符串 在Java编程中广泛使用的字符串是一系列字符,在Java编程语言中,字符串是对象。 Java平台提供String类来创建和操作字符串。 创建字符串 创建字符串的最直接方法是编写: String greeting = Hello world!; 在这种情况下,Hello world!是一个字符串文字 — 代码中的一系列字符,用双引号括起来,每当它在代码中遇到字符串文字时,编译器就会创建一个带...
数字 本节首先讨论java.lang包中的Number类,它的子类,以及使用这些类的实例化而不是原始数字类型的情况。 本节还介绍了PrintStream和DecimalFormat类,它们提供了编写格式化数字输出的方法。 最后,讨论了java.lang中的Math类,它包含数学函数,以补充语言中内置的运算符,该类具有三角函数,指数函数等方法。 数字类 使用数字时,大多数时候在代码中使用基元类型,例...
摘要:创建字符串教程字符串长度用于获取有关对象的信息的方法称为访问器方法。类在中被提出,它和之间的最大不同在于的方法不是线程安全的不能同步访问。然而在应用程序要求线程安全的情况下,则必须使用类。 一般地,当需要使用数字的时候,我们通常使用内置数据类型,如:byte、int、long、double 等。 在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型的情形。为了解决这个问题,...
摘要:到目前为止,使用越来越广泛,不光光只是它强大的生成技术,而且它能够与进行很好的集成。注意使用数字范围来定义集合时无需使用方括号数字范围也支持反递增的数字范围如对象对象使用花括号包括中的对之间以英文冒号分隔,多组对之间以英文逗号分隔。 Freemarker的介绍 Freemarker 是一款模板引擎,是一种基于模版生成静态文件的通用 工具,它是为程序员提供的一个开发包,或者说是一个类...
阅读 3833·2021-09-27 13:56
阅读 880·2021-09-08 09:36
阅读 765·2019-08-30 15:54
阅读 609·2019-08-29 17:29
阅读 927·2019-08-29 17:21
阅读 1682·2019-08-29 16:59
阅读 2757·2019-08-29 13:03
阅读 2963·2019-08-29 12:47