导言

阅读java util 包的源码的时候,忽然发现了,一个格式化类的使用,看完以后,发现,以前写代码太没有思考了,copy 过来就来用,其实,如果,只是多了解一点的话,也算是给自己多一种方式.

一个简单的例子

question 1

我要输出一个当前时间的年月日时间格式的字符串
2013-04-28 22:20:12

一般而言我们可能会这么干

SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar cal = Calendar.getInstance();
System.out.println(dateFormater.format(cal.getTime()));

不过,如果能是一个C语言程序员的话,肯定会知道一个叫做格式化字符的机制,java很好的继承了这点,并且把这个机制做了一个加强,不但支持常规类型 而且也支持日期类型

System.out.println(String.format("%1$tF %1$tT", Calendar.getInstance()));

可能这段代码不太好动,如同正则一样那些复杂不太友好的字符,亮瞎了咱们的眼,但是,相对于正则的博大精深,java Formatter 机制明显简单很多,也许上面的那个例子,并不能打动你,不过,如果你的代码只需要进行字符的格式输出的话,并不需要解析的话,而你又不怎么熟悉正则的话,我推荐,java formatter 是你值得去了解使用的东西.虽然不是什么高深的东西,但是的确很常用.

语法简讲

格式说明符组成说明

中括号标注([])的为可选参数.

  1. 常规类型、字符类型和数值类型的格式说明符的语法如下:

    %[argument_index$][flags][width][.precision]conversion
    %[参数索引][标识集][输出宽度][.限制字符]标明如何格式化字符

  2. 用来表示日期和时间类型的格式说明符的语法如下:

    %[argument_index$][flags][width]conversion
    conversion 是一个由两字符组成的序列。第一个字符是 't' 或 'T'。第二个字符表明所使用的格式。

  3. 与参数不对应

    %[flags][width]conversion

标识集(flags)

在整个Formatter 让我最难懂的就是标识集的用法.限制大,功能看上去不强大.

以下为官方原档

下表总结了受支持的标志。y 表示该标志受指示参数类型支持。
标志 常规 字符 整数 浮点 日期/时间 说明
'-' y y y y y 结果将是左对齐的。
'#' y1 - y3 y - 结果应该使用依赖于转换类型的替换形式
'+' - - y4 y - 结果总是包括一个符号
' ' - - y4 y - 对于正值,结果中将包括一个前导空格
'0' - - y y - 结果将用零来填充
',' - - y2 y5 - 结果将包括特定于语言环境的组分隔符
'(' - - y4 y5 - 结果将是用圆括号括起来的负数
1 取决于 Formattable 的定义。
2 只适用于 'd' 转换。
3 只适用于 'o'、'x' 和 'X' 转换。
4 对 BigInteger 应用 'd'、'o'、'x' 和 'X' 转换时,或者对 byte 及 Byte、short 及 Short、int 及 Integer、long 及 Long 分别应用 'd' 转换时适用。
5 只适用于 'e'、'E'、'f'、'g' 和 'G' 转换。

内置有7个标识位,而且限制多多,后来经过一番折腾,终于发现,这个标识位其实最大的作用用于实现Formattable 接口使用.

举一个使用场景:

例如符号数的显示

String.format("%1$+d",1 )
输出 +1

这个例子...不过,没什么特殊要求的话可以忽略这个标识位的使用

转换类型

  1. 常规 - 可应用于任何参数类型

  2. 字符 - 可应用于表示 Unicode 字符的基本类型:char、Character、byte、Byte、short 和 Short。当 Character.isValidCodePoint(int) 返回 true 时,可将此转换应用于 int 和 Integer 类型

  3. 数值

    1. 整数 - 可应用于 Java 的整数类型:byte、Byte、short、Short、int、Integer、long、Long 和 BigInteger
    2. 浮点 - 可用于 Java 的浮点类型:float、Float、double、Double 和 BigDecimal
  4. 日期/时间 - 可应用于 Java 的、能够对日期或时间进行编码的类型:long、Long、Calendar 和 Date。

  5. 百分比 - 产生字面值 '%' ('\u0025')

  6. 行分隔符 - 产生特定于平台的行分隔符

更多参考源文档java.util.Formatter

附录

可能日期的格式化处理用得比较多,我就把api doc里面的文档直接复制过来

以下日期和时间转换的后缀字符是为 't' 和 'T' 转换定义的。这些类型相似于但不完全等同于那些由 GNU date 和 POSIX strftime(3c) 定义的类型。提供其他转换类型是为了访问特定于 Java 的功能(如将 'L' 用作秒中的毫秒)。

以下转换字符用来格式化时间: 'H' 24 小时制的小时,被格式化为必要时带前导零的两位数,即 00 - 23。
'I' 12 小时制的小时,被格式化为必要时带前导零的两位数,即 01 - 12。
'k' 24 小时制的小时,即 0 - 23。
'l' 12 小时制的小时,即 1 - 12。
'M' 小时中的分钟,被格式化为必要时带前导零的两位数,即 00 - 59。
'S' 分钟中的秒,被格式化为必要时带前导零的两位数,即 00 - 60 ("60" 是支持闰秒所需的一个特殊值)。
'L' 秒中的毫秒,被格式化为必要时带前导零的三位数,即 000 - 999。
'N' 秒中的毫微秒,被格式化为必要时带前导零的九位数,即 000000000 - 999999999。
'p' 特定于语言环境的 上午或下午 标记以小写形式表示,例如 "am" 或 "pm"。使用转换前缀 'T' 可以强行将此输出转换为大写形式。
'z' 相对于 GMT 的 RFC 822 格式的数字时区偏移量,例如 -0800。
'Z' 表示时区缩写形式的字符串。Formatter 的语言环境将取代参数的语言环境(如果有)。
's' 自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所经过的秒数,即 Long.MINVALUE/1000 与 Long.MAXVALUE/1000 之间的差值。
'Q' 自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所经过的毫秒数,即 Long.MINVALUE 与 Long.MAXVALUE 之间的差值。

以下转换字符用来格式化日期: 'B' 特定于语言环境的月份全称,例如 "January" 和 "February"。
'b' 特定于语言环境的月份简称,例如 "Jan" 和 "Feb"。
'h' 与 'b' 相同。
'A' 特定于语言环境的星期几全称,例如 "Sunday" 和 "Monday"
'a' 特定于语言环境的星期几简称,例如 "Sun" 和 "Mon"
'C' 除以 100 的四位数表示的年份,被格式化为必要时带前导零的两位数,即 00 - 99
'Y' 年份,被格式化为必要时带前导零的四位数(至少),例如,0092 等于格里高利历的 92 CE。
'y' 年份的最后两位数,被格式化为必要时带前导零的两位数,即 00 - 99。
'j' 一年中的天数,被格式化为必要时带前导零的三位数,例如,对于格里高利历是 001 - 366。
'm' 月份,被格式化为必要时带前导零的两位数,即 01 - 13。
'd' 一个月中的天数,被格式化为必要时带前导零两位数,即 01 - 31
'e' 一个月中的天数,被格式化为两位数,即 1 - 31。

以下转换字符用于格式化常见的日期/时间组合。 'R' 24 小时制的时间,被格式化为 "%tH:%tM"
'T' 24 小时制的时间,被格式化为 "%tH:%tM:%tS"。
'r' 12 小时制的时间,被格式化为 "%tI:%tM:%tS %Tp"。上午或下午标记 ('%Tp') 的位置可能与语言环境有关。
'D' 日期,被格式化为 "%tm/%td/%ty"。
'F' ISO 8601 格式的完整日期,被格式化为 "%tY-%tm-%td"。
'c' 日期和时间,被格式化为 "%ta %tb %td %tT %tZ %tY",例如 "Sun Jul 20 16:17:00 EDT 1969"。

任何未明确定义为转换的字符都是非法字符,并且都被保留,以供将来扩展使用。

转载于:https://blog.51cto.com/youxilua/1189602

Java Formatter 阅读心得相关推荐

  1. 深入理解Java虚拟机阅读心得(二)

    深入理解Java虚拟机阅读心得(二) 垃圾收集 程序计数器.虚拟机栈.本地方法栈三个区域随线程而生,随线程而灭:这几个区域的内存分配和回收都具备稳定性,不需要过多的考虑回收的问题.而Java堆和方法区 ...

  2. java读书心得_深入理解Java虚拟机阅读心得(三)

    Java中提倡的自动内存管理最终可以归结为自动化的解决两个问题: 给对象分配内存 回收分配给对象的内存 先说说回收这一方面的两个主要知识点 一.垃圾收集算法 1.标记-清理算法 首先标记出所有需要回收 ...

  3. java容器doc_关于Java容器类学习心得体会.doc

    关于Java容器类学习心得体会 由于小编对C++比较熟悉所以学习Java应该重点体会Java带来的新概念本文基本上是Java标准库中集合框架的基本概念没有例子写本文的目的在于方便小编很长时间后若是忘了 ...

  4. java实训心得感想30字,java实训心得体会感想

    java实训心得体会感想 Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言.通过本次实训,受益很多,下面谈谈个人的心得体会.本文是java实训心得,希望对大家有帮助. java实训心得篇一 ...

  5. java实验2总结心得,java实验的心得体会

    java实验的心得体会 java实验心得体会篇一:java实验总结 1. 设计一个Person类,包含:姓名,年龄,性别.要求:该类至多只能创建一男.一女两个对象! 2. 设计一个测试类Test,创建 ...

  6. java课程设计心得体会绪论

      java课程设计心得体会绪论[篇1] 在上学期的最后一周和本学期的第一周,我和同组的学员在学校机房进行了JAVA暑期实训,现在已经结束了. 回首上学期的java学习,重点还是在学习概念等一些常识性 ...

  7. Java EE学习心得

    –Java EE学习心得   1.    称为编程专家的秘诀是: 思考-----编程--------思考------编程--.. 编程不能一步到位,不能一上来就编,必须先思考如何写,怎样写?然后再编程 ...

  8. Java异常学习心得

    2019独角兽企业重金招聘Python工程师标准>>> Java异常学习心得             本文重在Java中异常机制的一些概念.写本文的目的在于方便我很长时间后若是忘了这 ...

  9. libevent源码学习-----阅读心得

    框架设计思路 libevent使用统一事件源将所有问题都转化为event,比如将套接字/信号/描述符都在内部转化为event,由相应的io多路复用函数进行监控. 为了提供对超时event的支持,lib ...

最新文章

  1. javascript 点点滴滴01章 javascript的认知
  2. 如何发布Jar包到Maven中央仓库
  3. java项目引入json配置,TS-28 配置tsconfig.json(3):工程引用
  4. matlab 图像分割并填充颜色
  5. 神经网络 游戏,神经连接游戏
  6. java判断一个数是不是素数_Java判断一个数是不是素数
  7. VMware中Linux虚拟机root密码重置
  8. 【蓝桥杯单片机笔记6】PWM脉宽调制信号
  9. 理解SPI/Dual SPI/Quad SPI/QPI之间的区别
  10. 【windows查看电脑属性配置 dxdiag】
  11. 使用IBM MQ远程连接时报错AMQ 4043解决思路
  12. wxpython中表格顶角怎么设置,wxpython listctrl并修复列宽
  13. 互联网创业必须知道的几个名词:蝴蝶效应、青蛙现象、鳄鱼法则……
  14. 运行Powershell脚本提示“因为在此系统上禁止运行脚本”解决办法
  15. Failed to restart networking.service: Unit networking.service not found.
  16. 机器视觉(二):机器视觉硬件技术
  17. zblog是PHP好还是,PJBlog和Z-blog哪个好,他们各自的优点是什么,做SEO哪个好
  18. 【JY】钢筋混凝土正截面极限承载力设计的基本原理和快速计算方法
  19. 学习并发编程的好网站
  20. 马儿走了,传送一篇《终究有梦吧!内马尔有野心,为梦想离开》

热门文章

  1. android 设置超时时间,为android requestSingleUpdate设置超时
  2. 查看eclipse中项目部署位置
  3. 要认识流程管理的局限性
  4. 【转载】VBA 读取EXCEL 行列总数
  5. VB如何直接显示内存中的二进制图像数据
  6. 成立两年估值17亿美元,这家Hinton点赞的AI芯片公司获宝马微软投资
  7. 英伟达新GPU发布:快到飞起,快到老黄瞬间学会了跳舞
  8. 吴恩达悄然发布AI维基,另外他的技术岗已经招满了
  9. js中判断数组中是否含有某个字符串方法
  10. C语言 · 猜算式