我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法

简介: 本文参考: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.htmlhttp://www.blogjava.net/AS-COM/archive/2011/03/15/346321.html?opt=admin 有时会想把数字,日期,字符串按照给定规则给格式化。


本文参考:


有时会想把数字,日期,字符串按照给定规则给格式化。SUN JDK为我们提供了这个API,它是java.util.Formatter此类提供了对布局对齐和排列的支持,以及

 

对数值、字符串和日期/时间数据的常规格式和特定于语言环境的输出的支持。

 

如何格式化?

给定规则:

  要想按照自己的想法格式化必须事先编写一个规则。那这个规则要怎么编写?

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

   %[argument_index$][flags][width][.precision]conversion

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

   %[argument_index$][flags][width]conversion

3.与参数不对应的格式说明符的语法如下:

  %[flags][width]conversion

API中有这样三种规则,很显然第一个规则的内容是最全面的。其它规则的内容和第一规则的内容有重复,那单说第一规则内容,其它规则依次类推。

注意:规则一中的precision前面要加英文句号“.

 

API有以下解释:

可选的 argument_index 是一个十进制整数,用于表明参数在参数列表中的位置。第一个参数由 "1$"引用,第二个参数由"2$"引用,依此类推。

可选 flags 是修改输出格式的字符集。有效标志集取决于转换类型。

可选 width 是一个非负十进制整数,表明要向输出中写入的最少字符数。

可选 precision 是一个非负十进制整数,通常用来限制字符数。特定行为取决于转换类型。

所需 conversion 是一个表明应该如何格式化参数的字符。给定参数的有效转换集取决于参数的数据类型。

 

argument_index很好理解,就是一参数占位符,用来表示要被格式化的参数。

 

flags 

标志

常规

字符

整数

浮点

日期/时间

说明

'-'

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'转换时,或者对byteByte、shortShort、intInteger、longLong 分别应用 'd' 转换时适用。

5 只适用于 'e''E''f''g''G'转换。

任何未显式定义为标志的字符都是非法字符,并且都被保留,以供扩展使用。



width 就表示一最少字符数,被格式化参数用precision 截取器截取后与width 相比,被格式化参数字符数如果小于width ,则加字符则到等于width 。如果大于则width 不起作用。所以可以叫width 为少加多过器。

 

precision 在上面也提到了,precision 是一个截取器,用于截取被格式化参数。

 

conversion 转换可分为以下几类:

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

 字符-可应用于表示Unicode字符的基本类型:charCharacter、byteByte、shortShort。当Character.isValidCodePoint(int) 返回 true时,可将此转换应用于 intInteger 类型

数值

1整数-可应用于Java的整数类型:byteByte、shortShort、intInteger、longLong BigInteger

2浮点-可用于Java的浮点类型:floatFloat、doubleDouble BigDecimal

 日期/时间-可应用于Java的、能够对日期或时间进行编码的类型:longLongCalendar Date

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

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

 

常规

B b

如果参数arg 为 null,则结果为 "false"。如果arg 是一个 boolean 值或Boolean,则结果为String.valueOf() 返回的字符串。否则结果为 "true"

H h

如果参数arg 为 null,则结果为 "null"。否则,结果为调用Integer.toHexString(arg.hashCode()) 得到的结果。

S s

如果参数arg 为 null,则结果为 "null"。如果arg 实现 Formattable,则调用arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。

字符

C c

结果是一个 Unicode字符

整数

d

结果被格式化为十进制整数

o

结果被格式化为八进制整数

X x

结果被格式化为十六进制整数

浮点

E e

结果被格式化为用计算机科学记数法表示的十进制数

f

结果被格式化为十进制数

G g

根据精度和舍入运算后的值,使用计算机科学记数形式或十进制格式对结果进行格式化。

A a

结果被格式化为带有效位数和指数的十六进制浮点数

日期,日间

T t

日期和时间转换字符的前缀

百分比

%

结果为字面值 '%'

行分隔符

n

结果为特定于平台的行分隔符

 

常出现的异常

 

java.util.IllegalFormatConversionException: d != java.lang.Double : 被格式化参数类型与规则转换类型不对应。

 

java.util.FormatFlagsConversionMismatchException: Conversion = d, Flags = #  : flag不适用于规则转换类型。

 

Formatter类是用正则表达式验证给定规则的

 

正则表达式如下:

 private static final String formatSpecifier

=

  "%(\\d+\\$)?([-#+0,(\\<]*)?(\\d+)?(\\.\\d+)?([tT])?([a-zA-Z%])";

 

 

   总结:

  •    最重要的是它可以格式化日期 / 时间 , 数值和字符。
  •    可以把日期转换成年,月,日,星期等。可以为数值填充空格或 0 ,添加分组字符,正负号,及小括号。 我们可以在 System.out.format    (),String.format() 方法中直接应用 Formatter 类。


下面贴一段代码,将Android中的播放器的进度值之转换为相应的时间

/**
	 * 格式化的格式
	 */
	private StringBuilder sFormatBuilder = new StringBuilder();
	/**
	 * 格式化类
	 */
	private Formatter sFormatter = new Formatter(sFormatBuilder, Locale.getDefault());
	/**
	 * 格式化的相关属性
	 */
	private final Object[] sTimeArgs = new Object[3];
	/**
	 * 转换进度值为时间
	 * @param secs
	 * @return
	 */
	private String makeTimeString(int secs) {
		/**
		 * %[argument_index$][flags][width]conversion
		 * 	可选的 argument_index 是一个十进制整数,用于表明参数在参数列表中的位置。第一个参数由 "1$" 引用,第二个参数由 "2$" 引用,依此类推。
			可选 flags 是修改输出格式的字符集。有效标志集取决于转换类型。
			可选 width 是一个非负十进制整数,表明要向输出中写入的最少字符数。
			可选 precision 是一个非负十进制整数,通常用来限制字符数。特定行为取决于转换类型。
			所需 conversion 是一个表明应该如何格式化参数的字符。给定参数的有效转换集取决于参数的数据类型。
		 */
		String durationformat = getString(R.string.durationformat);//<xliff:g id="format">%1$02d:%2$02d:%3$02d</xliff:g>
		sFormatBuilder.setLength(0);
		secs = secs / 1000;
		Object[] timeArgs = sTimeArgs;
		timeArgs[0] = secs / 3600;   //时
		timeArgs[1] = (secs % 3600) / 60;   //分   
		timeArgs[2] = (secs % 3600 % 60) % 60;   //秒
		return sFormatter.format(durationformat, timeArgs).toString().trim();
	}

其中R.string.durationformat定义如下:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <string name="durationformat" translatable="false"><xliff:g id="format">%1$02d:%2$02d:%3$02d</xliff:g></string>
</resources>

关于格式化时间,还可以参考我的博客

《我的Java开发学习之旅------>工具类:将播放器的进度值转换成相应的时间格式》

地址:http://blog.csdn.net/ouyang_peng/article/details/17164255


什么是xliff?可以参考http://baike.baidu.com/view/4160854.htm

====================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址http://blog.csdn.net/ouyang_peng

====================================================================================


相关文章
|
1天前
|
JavaScript Java 测试技术
基于Java的精品课程在线学习系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的精品课程在线学习系统的设计与实现(源码+lw+部署文档+讲解等)
9 1
|
1天前
|
JavaScript Java 测试技术
基于Java的中文学习系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的中文学习系统的设计与实现(源码+lw+部署文档+讲解等)
8 0
|
1天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
26 10
|
1天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
2天前
|
Java 编译器
Java Character 类
4月更文挑战第13天
|
3天前
|
存储 Java
Java基础教程(7)-Java中的面向对象和类
【4月更文挑战第7天】Java是面向对象编程(OOP)语言,强调将事务抽象成对象。面向对象与面向过程的区别在于,前者通过对象间的交互解决问题,后者按步骤顺序执行。类是对象的模板,对象是类的实例。创建类使用`class`关键字,对象通过`new`运算符动态分配内存。方法包括构造函数和一般方法,构造函数用于对象初始化,一般方法处理逻辑。方法可以有0个或多个参数,可变参数用`类型...`定义。`this`关键字用于访问当前对象的属性。
|
7天前
|
Java Shell
Java 21颠覆传统:未命名类与实例Main方法的编码变革
Java 21颠覆传统:未命名类与实例Main方法的编码变革
10 0
|
7天前
|
Java
Java 15 神秘登场:隐藏类解析未知领域
Java 15 神秘登场:隐藏类解析未知领域
10 0
|
7天前
|
Java 存储
键值之道:深入学习Java中强大的HashMap(二)
键值之道:深入学习Java中强大的HashMap
10 0
键值之道:深入学习Java中强大的HashMap(二)
|
8天前
|
运维 NoSQL 算法
Java开发-深入理解Redis Cluster的工作原理
综上所述,Redis Cluster通过数据分片、节点发现、主从复制、数据迁移、故障检测和客户端路由等机制,实现了一个分布式的、高可用的Redis解决方案。它允许数据分布在多个节点上,提供了自动故障转移和读写分离的功能,适用于需要大规模、高性能、高可用性的应用场景。
15 0