详述 Java 语言中的格式化输出

详述 Java 语言中的格式化输出1前言相信大家在学习Java语言的时候,见到的第一条输出语句,就是:System.out.println(“HelloWorld”);毫无疑问,该语句的作用就是将HelloWorld打印到控制台,格式也非常的简单,直接按原格式输出。但是,如果将输出的内容换成“数值”或者“日期”呢?其打印的格式是否会有什么不同的变化呢?在本文中,就让咱们一起看一看在Java语言中,数值和日期是如何进行格

大家好,又见面了,我是你们的朋友全栈君。

1 前言

相信大家在学习 Java 语言的时候,见到的第一条输出语句,就是:

System.out.println("Hello World");

毫无疑问,该语句的作用就是将Hello World打印到控制台,格式也非常的简单,直接按原格式输出。

但是,如果将输出的内容换成“数值”或者“日期”呢?其打印的格式是否会有什么不同的变化呢?接下来,就让咱们一起看一看在 Java 语言中,数值和日期是如何进行格式化输出的。

2 数值

首先,给出代码示例:

/** * @author 维C果糖 * @create 2017-03-28-上午9:45 */

public class SysDemo { 
   
    public static void main(String[] args) {
        double d = -12345.678;
        System.out.printf("%6.2f" , d);
        System.out.println();
        System.out.printf("%,(.2f" , d);
        System.out.println();
        System.out.printf("%,6.1f" , d);
        System.out.println();
        System.out.printf("%s" , d);        // 转换成字符串
        System.out.println();
        System.out.printf("%h" , d);        // 转换成散列码
    }
}

运行上述代码,结果如下图所示:

这里写图片描述

如上图所示,以输出第一个结果的代码为例,%6.2f表示除符号位外,共6+2=8个字符的宽度,以及小数点后两个字符的精度打印数值。其中,每一个以%字符开始的格式说明符都用相应的参数进行替换,格式说明符尾部的转换符表示被格式化的数值类型,例如f就表示浮点数。下面,列出常用的转换符:

转换符 类型 举例
d 十进制整数 250
f 定点浮点数 12.3
s 字符串 hello
c 字符 a
b 布尔型 true
h 散列码 87c258e

此外,如第二个输出结果所示,还有用于printf函数的标记。下面列出常见的标记:

标记 目的 举例
+ 打印正数和负数的符合 +12345.6
( 将负数括在括号内 (12345.68)
添加分组分隔符 12,345.7
0 数字前面用 0 补位 00123.45

在这里,可以使用s转换符格式化任意的对象。对于任意实现了Formattable接口的对象,都将调用formatTo方法;否则将调用toString方法,她可以将对象转换为字符串。

3 日期

首先,给出代码示例:

import java.util.Date;

/** * @author 维C果糖 * @create 2017-03-28-上午10:20 */

public class SysDemo { 
   
    public static void main(String[] args) {
        System.out.printf("%tc", new Date());
        System.out.println();
        System.out.printf("%tF", new Date());
        System.out.println();
        System.out.printf("%tT", new Date());
        System.out.println();
        System.out.printf("%tQ", new Date());
    }
}

运行上述代码,结果如下图所示:

这里写图片描述

如上图所示,以输出第一个结果的代码为例,%tc表示输出完整的日期和时间。在这里,使用以t开始,以下表中任意字母结束的两个字母格式,此外,下面基本全部列出了关于日期与时间的转换符:

转换符 类型 举例
c 完整的日期和时间 星期二 三月 28 11:00:52 CST 2017
F ISO 8601 日期 2017-03-28
D 美国格式的日期(月/日/年) 03/28/2017
T 24 小时时间 11:00:52
r 12 小时时间 11:00:52 am
R 24 小时时间没有秒 11:00
Y 4 位数字的年(前面补 0) 2017
y 年的后两位数字(前面补 0) 17
C 年的前两位数字(前面补 0) 20
B 月的完整拼写 March
b 或者 h 月的缩写 Mar
m 两位数字的月(前面补 0) 03
d 两位数字的日(前面补 0) 28
e 两位数字的月(前面不补 0) 3
A 星期几的完整拼写 Monday
a 星期几的缩写 Mon
j 三位数中的年的日(前面补 0),在 0001 到 366 之间 087
H 两位数字的小时(前面补 0),在 0 到 23 之间 11
k 两位数字的小时(前面不补 0),在 0 到 23 之间 11
M 两位数字的分钟(前面补 0) 26
S 两位数字的秒(前面补 0) 17
L 三位数字的毫秒 413
N 九位数字的毫微秒 413000000
P 上午或下午的大写标志 AM
p 上午或下午的小写标志 am
z 从 GMT 起,RFC822 数位位移 +0800
Z 时区 CST
s 从格林威治时间 1970-01-01 00:00:00 起的秒数 1490671516
Q 从格林威治时间 1970-01-01 00:00:00 起的毫秒数 1490670052093

从上表中可以看出来,有些格式只给出了指定日期的部分信息,例如只给出月份或者日期。如果需要多次对日期操作才能实现对每一部分日期进行格式化的目的就太 low 啦!因此,咱们可以采用一个格式化的字符串,指出要被格式化的“参数索引”。索引必须紧跟在%的后面,并以$终止。例如,

System.out.printf("%1$s %2$tB %2$te %2$tY","Due Date:",new Date());

其输出结果为:

这里写图片描述

咱们可以选择使用<标志,她表示前面格式说明中的参数将被再次使用。也就是说,下面的代码将产生与前面语句同样的输出结果:

System.out.printf("%s %tB %<te %<tY","Due Date:",new Date());

提示:参数索引从 1 开始,而不是从 0 开始,%1$,表示对第 1 个参数格式化。


最后,在此给出“ 格式说明符 ”的语法规则:

这里写图片描述

内容不多,但也希望能够对大家理解格式化输出有些帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/156845.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • SQL中的模糊查询like「建议收藏」

    SQL中的模糊查询like「建议收藏」首先我们创建一个Person表。createtablePerson(cnamevarchar2(50),cagenumber(3));插入一些数据:insertintoPerson(cname,cage)values(‘张三’,19);insertintoPerson(cname,cage)values(‘张三丰’,20);insertintoPerson(cname,cage)valu…

  • Could not find a version that satisfies the requirement tensorflow问题汇总+解决!!!

    Could not find a version that satisfies the requirement tensorflow问题汇总+解决!!!前言:极力推荐使用Anaconda——————————————————————————一般报错就是:问题一CouldnotfetchURLhttps://pypi.python.org/simple/….然后就是:问题二Couldnotfindaver…

  • CSS导航条制作心得

    CSS导航条制作心得今天学习了导航条的制作,感觉收获很大!学习了一段时间的css和html。之前都是在慕课网上面看视频学习的,感觉收获不是特别大,有一点慢,效率不高。学东西还是得边做边学变想,学习编程最好能够不断地实践,毕竟实践出真知。学习了这个作者的文章http://www.missyuan.com/thread-438839-1-1.html    1.导航条放于div容器中——-ui和li来写

  • IntelliJ IDEA集成svn

    IntelliJ IDEA集成svnEclipse集成svn相信大家已经非常熟悉了,但是IntelliJIDEA如何集成svn呢?下面简单介绍一下(其他的版本控制工具的集成类似):1.首先配置下载并配置svn软件,推荐使用SlikSvn。2.在IntelliJIDEA集成svn,选择Subversion。3.配置完成之后就可以从svn服务器上checkout代码。4.修改代码之后,在该文件或

    2022年10月18日
  • 【JAVA面试必会】JMM高并发详解(java内存模型、JMM三大特征、volatile关键字 )「建议收藏」

    【JAVA面试必会】JMM高并发详解(java内存模型、JMM三大特征、volatile关键字 )「建议收藏」volatile一定能保证线程安全吗?禁止指令重排序volatile禁止指令重排序的原理。JMM就是Java内存模型(javamemorymodel)。因为在不同的硬件生产商和不同的操作系统下,内存的访问有一定的差异,所以会造成相同的代码运行在不同的系统上会出现各种问题。所以java内存模型(JMM)屏蔽掉各种硬件和操作系统的内存访问差异,以实现让java程序在各种平台下都能达到……………

  • PCB设计-Allegro软件入门系列第九讲-Class分类和Subclass应用

    PCB设计-Allegro软件入门系列第九讲-Class分类和Subclass应用在Allegro软件中,Class和SubcClass是一个相对新的专业术语,这里单独拿一节出来给大家讲解一下。相信不少画过PCB的读者也许跟笔者一样也用过AD,刚从AD过来学习allegro都会发现allegro这个平台所有对象都分Class和Subclas。比如上一节中的板框我是定义在了BoardGeometry的Outline里面。其实Allegro将所有元素都分类的很仔细是方便后…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号