Format类及其子类功能和使用方法具体解释
1. Format类结构:
· java.lang.Object
· java.text.Format
· All Implemented Interfaces:
Serializable, Cloneable
Direct Known Subclasses:
DateFormat, MessageFormat, NumberFormat
public abstract class Format
extends Object
implements Serializable, Cloneable
2.Format类概述:
Format 是一个用于格式化语言环境敏感的信息(如日期、消息和数字)的抽象基类。
Format 定义了编程接口,用于将语言环境敏感的对象格式化为String(使用 format 方法)和将 String 又一次解析为对象(使用 parseObject 方法)。
通常。一个 format 的 parseObject方法必须能解析不论什么由其 format 方法格式化的字符串。
只是,也可能存在不能解析的异常情况。
比如。format 方法可能创建中间无分隔符的两个相邻整数,在这样的情况下,parseObject 无法推断哪个数字属于哪个数。
Java 平台为格式化日期、消息和数字分别提供了三个特殊的Format 的子类:DateFormat、MessageFormat 和 NumberFormat。
详细的子类必须实现三个方法:
format(Object obj, StringBuffertoAppendTo, FieldPosition pos)
formatToCharacterIterator(Object obj)
parseObject(String source,ParsePosition pos)
这些常规方法同意对对象进行多态解析和格式化。还能够被使用(如被 MessageFormat 使用)。子类通常也为特定的输入类型提供了另外的 format 方法,也为特定的结果类型提供了parse 方法。当在输入文本的開始没有不论什么所需格式的文本时,则不论什么不带 ParsePosition 參数的 parse 方法都应该抛出 ParseException。
大多数子类还将实现下面工厂方法:
getInstance 获取一个适合于当前语言环境的实用的格式对象
getInstance(Locale)获取一个适合于指定语言环境的实用的格式对象。
此外,某些子类还可能为了更特殊的控制实现其他 getXxxxInstance 方法。比如,NumberFormat 类提供了 getPercentInstance 和 getCurrencyInstance 方法来获取特殊的数字格式器。
Format 的子类假设同意程序猿能为不同语言环境(比方用 getInstance(Locale) )创建对象,必须实现下面类方法:
public staticLocale[] getAvailableLocales()
最后子类定义一个常量集合来标识格式输出中的不同字段。这些常量用于创建一个 FieldPosition 对象。该对象标识字段中所包括的信息及其在格式化结果中的位置。这些常量应当命名为item _FIELD,当中item 标识了该字段。
有关这些常量的样例,请參阅 ERA_FIELD 及其在 DateFormat 中的同类。
3.创建Format类的实例
由于Format是抽象类,所以我们无法通过Format 的构造方法(非公有的)来实例化Format类的对象。如以下的写法是错误的:
Format format=new Format();
那么我们怎样实例化Format类的实例呢?
我们能够利用Java面向对象语言的多态性来解决问题:
通过父类型的引用能够指向子类型的对象。说白了就是用子类去实例化父类的对象。如以下的做法:
Format format;
//通过子类直接实例化Format类的对象(适用于子类不是抽象类的情况)
format=new MessageFormat("hh");
//通过子类的getXxxxInstance()来实例化Format类的对象(适用于子类是抽象类的情况)
format=NumberFormat.getCurrencyInstance();
format=DateFormat.getDateInstance();
4. DateFormat类
DateFormat 是Format类的抽象子类, 有一些static的getXxxxInstance()方法来获得实例。通过设置结果的长度和地区,来获得日期,时间等的格式。
DateFormat不太经常使用。
通常会使用SimpleDateFormat子类。newSimpleDateFormat("yyyy-MM-dd")或newSimpleDateFormat("yyyy-MM-dd HH:mm:ss")等。来获得经常使用的时间格式。
能够通过设置的getXxxxInstance()方法来实例化DateFormat类的对象。
DateFormat类中另一些static的字段,如WEEK_OF_MONTH_FIELD,WEEK_OF_YEAR_FIELD。
api上说在FieldPosition中使用,用于对齐。
java.util.Calendar也是日期操作相关的类,实现类为GregorianCalendar。
主要对日期进行操作。注意add方法和roll方法的差别。roll方法不更改更大的字段。另一些静态的变量DAY_OF_MONTH,DAY_OF_WEEK等。在get/set/add/roll方法中使用。
4.1DateFormat的使用方法举例:
Date d = new Date(); String s; /** Date类的格式: Sat Aug 30 13:05:56 CST 2014 */ System.out.println(d); System.out.println("******************************************");
/** 输出格式: 2014-8-30 */ s = DateFormat.getDateInstance().format(d); System.out.println(s);
/** 输出格式: 2014-8-30 */ s = DateFormat.getDateInstance(DateFormat.DEFAULT).format(d); System.out.println(s);
/** 输出格式: 2014年8月30日 星期六 */ s = DateFormat.getDateInstance(DateFormat.FULL).format(d); System.out.println(s);
/** 输出格式: 2014-8-30 */ s = DateFormat.getDateInstance(DateFormat.MEDIUM).format(d); System.out.println(s);
/** 输出格式: 14-8-30 */ s = DateFormat.getDateInstance(DateFormat.SHORT).format(d); System.out.println(s);
/** 输出格式: 2014-08-30 01:02:02 */ DateFormat format1 = new SimpleDateFormat( "yyyy-MM-dd hh:mm:ss"); s = format1.format(new Date()); System.out.println(s); |
5. NumberFormat类:
NumberFormat 是全部数值格式的抽象基类。此类提供格式化和解析数值的接口。NumberFormat 还提供了一些方法来确定哪些语言环境具有数值格式,以及它们的名称是什么。
NumberFormat 可用于格式化和解析不论什么语言环境的数值。使代码可以全然独立于小数点、千位分隔符甚至所用特定小数位数的语言环境约定,并与数值格式是否为偶小数无关。
5.1NumberFormat的使用方法举例:
double num=868326.81472676; double test=3.1415926; //返回当前缺省语言环境的缺省数值格式。 /*输出结果:868,326.815*/ String myString = NumberFormat.getInstance().format(num); System.out.println(myString); //getCurrencyInstance()返回当前缺省语言环境的通用货币格式/*输出结果:¥868,326.81*/ myString = NumberFormat.getCurrencyInstance().format(num); System.out.println(myString); //getNumberInstance() 返回当前缺省语言环境的通用数值格式/*输出结果:868,326.815*/。 myString = NumberFormat.getNumberInstance().format(num); System.out.println(myString);
//getPercentInstance() 返回当前缺省语言环境的百分比格式。/*输出结果:314%*/ myString = NumberFormat.getPercentInstance().format(test); System.out.println(myString);
NumberFormat format = NumberFormat.getInstance(); // 设置数值的小数部分同意的最大位数。 /*输出结果:868,326.815 */ format.setMaximumFractionDigits( 3 ); System.out.println(format.format(num)); // 设置数值的整数部分同意的最大位数。 /*输出结果:26.815 */ format.setMaximumIntegerDigits(2); System.out.println(format.format(num));
// 设置数值的小数部分同意的最小位数。 /*输出结果:26.815 */ format.setMinimumFractionDigits(2); System.out.println(format.format(num)); // 设置数值的整数部分同意的最小位数。 /*输出结果:26.815 */ format.setMinimumIntegerDigits(2); System.out.println(format.format(num)); |
6. MessageFormat
类:
MessageFormat
提供了以与语言无关方式生成连接消息的方式。使用此方法构造向终端用户显示的消息。
MessageFormat
获取一组对象。格式化这些对象。然后将格式化后的字符串插入到模式中的适当位置。
注:MessageFormat
不同于其它Format
类,由于MessageFormat
对象是用其构造方法之中的一个创建的(而不是使用getInstance
样式的工厂方法创建的)。
工厂方法没必要的,由于MessageFormat
本身不实现特定于语言环境的行为。
特定于语言环境的行为是由所提供的模式和用于已插入參数的子格式来定义的。