Java.text包学习笔记

来源:互联网 发布:面向对象编程的特点 编辑:程序博客网 时间:2024/04/25 06:43

一 java.text包概述:

Java API中对java.text包的描述为:

  提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。这意味着所编写的主程序或 applet 是与语言无关的,并且它可以依靠独立的、动态链接的本地化资源。这实现了随时为新本地化添加本地化的灵活性。这些类能够格式化日期、数字和消息,分析,搜索和排序字符串,以及迭代字符、单词、语句和换行符。java.text包包含了迭代文本、格式化和分析和整理字符串三大主要类和接口组。

二 java.text.Format

java.text.format是一个抽象类,它实现了两个接口Serializable和CloneableJava 2 平台为格式化日期、消息和数字分别提供了三个特殊的 Format 的子类:DateFormat、MessageFormat 和 NumberFormat。从名字上就可以看出这三个类分别适用于日期格式化、消息格式化和数字格式化,其中NumberFormat与DateFormat是两个抽象类。

2.1       java.text.DateFormat

2.1.1  DateFormat的继承结构

                    java.lang.Object

         java.text.Format

               java.text.DateFormat

2.1.2 详细描述

DateFormat具体的子类必须实现的三个方法: (在DateFormat中是抽象方法)

  1. format(Object obj, StringBuffer toAppendTo, FieldPosition pos)

格式化一个对象并将得到的文本追加到给定的字符缓冲区。

  1. formatToCharacterIterator(Object obj)

格式化一个对象,生成一个AttributedCharacterIterator。

  1. parseObject(String source, ParsePosition pos)

分析字符串文本,生成一个对象。

这些常规方法允许对对象进行多态分析和格式化,还可以被使用(如被MessageFormat 使用)。子类通常也为特定的输入类型提供了另外的 format 方法,也为特定的结果类型提供了 parse 方法。当在输入文本的开始没有任何所需格式的文本时,则任何不带 ParsePosition 参数的 parse 方法都应该抛出 ParseException。

Format 的子类如果允许程序员能为不同语言环境(比如用 getInstance(Locale) )创建对象,必须实现以下类方法:

public static Locale[] getAvailableLocales():

最后,子类可能定义一个常量集合来标识格式输出中的不同字段。这些常量用于创建一个 FieldPosition 对象,该对象标识字段中所包含的信息及其在格式化结果中的位置。这些常量应当命名为item _FIELD,其中item 标识了该字段。

DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并分析日期或时间。日期/时间格式化子类(如SimpleDateFormat)允许进行格式化(也就是日期 -> 文本)、分析(文本-> 日期)和标准化。将日期表示为Date 对象,或者表示为从 GMT(格林尼治标准时间)1970 年,1 月 1 日 00:00:00 这一刻开始的毫秒数。

DateFormat 提供了很多类方法,以获得基于默认或给定语言环境和多种格式化风格的默认日期/时间 Formatter。格式化风格包括 FULL、LONG、MEDIUM 和 SHORT。

DateFormat 可帮助进行格式化并分析任何语言环境的日期。对于月、星期,甚至日历格式(阴历和阳历),其代码可完全与语言环境的约定无关。

2.1.3 示例

例子1:下面是用DateFormat格式化日期的一个例子,这里使用DateFormat的getInstance()方法获取一个格式化的实例。从源代码中可以看到,getInstance()方法部分的代码:

public final static DateFormat getInstance() {

        return getDateTimeInstance(SHORT,SHORT);

}

可以看出该方法默认返回一个日期和时间都是SHORT类型的DateFormat对象。

输出结果为:12-3-30 上午4:17

例子2:定制日期数据的格式

         通过向SimpleDateFormat的构造函数传递格式字符串"EEE-MMMM-dd-yyyy", 我们就能够指明自己想要的格式. 你应该可以看见, 格式字符串中的ASCII 字符告诉格式化函数下面显示日期数据的哪一个部分. EEEE是星期, MMMM是月, dd是日, yyyy是年. 字符的个数决定了日期是如何格式化的.传递"EE-MM-dd-yy"会显示Sat-09-29-01.

SimpleDateFormat sdf=newSimpleDateFormat("MMMM-dd-yyyy hh:mm:ss");

结果:三月-30-2012 04:52:20

SimpleDateFormat sdf=newSimpleDateFormat("MM-dd-yyyy hh:mm:ss");

结果:03-30-201204:53:00

 

2.1.4     解析parse

将文本数据解析成日期对象。假设我们有一个文本字符串包含了一个格式化了的日期对象, 而我们希望解析这个字符串并从文本日期数据创建一个日期对象. 我们将再次以格式化字符串"MM-dd-yyyy" 调用SimpleDateFormat类, 但是这一次, 我们使用格式化解析而不是生成一个文本日期数据. 我们的例子, 显示在下面, 将解析文本字符串"9-29-2001"并创建一个对应的日期对象.

例子3:

输出结果为:Sat Sep 29 00:00:00 GMT 2001

 

例子4:

使用 DateFormat 的getDateInstance()方法能够获得该国家/地区的标准日期格式,格式化不同语言环境的日期,使用方式为:

 

2.1.5:其他

DateFormat还提供了一些其他静态工厂方法:使用 getTimeInstance 可获得该国家/地区的时间格式;使用 getDateTimeInstance 可获得日期和时间格式。可以将不同选项传入这些工厂方法,以控制结果的长度(从 SHORT 到 MEDIUM 到LONG 再到 FULL)。确切的结果取决于语言环境,但是通常:

·        SHORT 完全为数字,如 12.13.52 或 3:30pm

  • MEDIUM 较长,如 Jan 12, 1952
  • LONG 更长,如 January 12, 1952 或 3:30:32pm

·        FULL 是完全指定,如 Tuesday, April 12, 1952 AD 或 3:30:42pm PST。

如果愿意,还可以在格式上设置时区。如果想对格式化或分析施加更多的控制(或者给予用户更多的控制),可以尝试将从工厂方法所获得的 DateFormat 强制转换为 SimpleDateFormat。这适用于大多数国家/地区;只是要记住将其放入一个 try 代码块中,以防遇到特殊的格式。

         以下是使用内建的格式化过程,采用DateFormat. getDateTimeInstance()方法。

例子5:

输出结果为:

其中,前两行代码的作用是设置当前所处的时区,否则Date类默认获取的是格林尼治时间。

另外,在对getDateTimeInstance的每次调用中都传递了两个值. 第一个参数是日期风格, 而第二个参数是时间风格. 它们都是基本数据类型int(整型). 考虑到可读性, 我们使用了DateFormat 类提供的常量: SHORT,MEDIUM, LONG, 和 FULL。

 

2.2 数字格式化Java.text.DecimalFormat

2.2.1 描述:

Java.text.DecimalFormat类是专门用于对数字进行格式化的,其父类为NumberFormat。通过地该类答应你哟,可以为要输出的数字加上单位,或者控制数字的精度,用法:可以再DecimalFormat实例化时传递格式,也可以通过对象调用applyPattern()方法来设置格式。

Numberformat.getInstance()方法返回Numberformat的一个实例(实际上是Numberformat具体的一个子类,例如Decimalformat), 这适合根据本地设置格式化一个数字。也可以使用非缺省的地区设置,例如德国。然后格式化方法根据特定的地区规则格式化数字。这个程序也可以使用一个简单的形式:

例子1

输出结果:

其他格式化示例代码:

例子2

输出结果:

1234.57

1.235E0003

47%

 

在上面的例子中使用了 Decimalformat  Numberformat Decimalformat 常用于获得很好的格式控制,而Numberformat 常用于指定不同于本地的地区。DecimalformatNumberformat的一个子类,其实例被指定为特定的地区。因此,可以使用Numberformat.getInstance 指定一个地区,然后将结构强制转换为一个Decimalformat对象。这种方法在大多情况下适用,但是需要用try/catch 块包围强制转换以防转换不能正常工作 (大概在非常不明显得情况下使用一个奇异的地区)。下面是一个这样的例子:

例子3

输出结果:1234,56000

 

2.3 消息格式化Java.text. MessageFormat

2.3.1继承结构

                    java.lang.Object

         java.text.Format

               java.text. MessageFormat

实现的接口:Serializable,Cloneable

2.3.2描述

MessageFormat 提供了以与语言无关方式生成连接消息的方式。使用此方法构造向终端用户显示的消息。

MessageFormat 获取一组对象,格式化这些对象,然后将格式化后的字符串插入到模式中的适当位置。

注:MessageFormat 不同于其他 Format 类,因为 MessageFormat 对象是用其构造方法之一创建的(而不是使用 getInstance 样式的工厂方法创建的)。工厂方法不是必需的,因为MessageFormat 本身不实现特定于语言环境的行为。特定于语言环境的行为是由所提供的模式和用于已插入参数的子格式来定义的。

同步:消息格式不是同步的,最好为每个线程创建独立的格式实例。如果多个线程同时访问一个格式,则它必须是外部同步的。

2.3.3模式及解释

MessageFormat 使用以下形式的模式:

MessageFormatPattern:

         String

         MessageFormatPatternFormatElement String

 

 FormatElement:

         { ArgumentIndex}

         { ArgumentIndex, FormatType }

         { ArgumentIndex, FormatType , FormatStyle }

 

 FormatType: oneof

         numberdate time choice

 

 FormatStyle:

         short

         medium

         long

         full

         integer

         currency

         percent

         SubformatPattern

 

 String:

         StringPartopt

         StringStringPart

 

 StringPart:

         ''

         ' QuotedString'

         UnquotedString

 

 SubformatPattern:

         SubformatPatternPartopt

         SubformatPatternSubformatPatternPart

 

 SubFormatPatternPart:

         ' QuotedPattern'

         UnquotedPattern

其中,在String中用“”表示单引号,QuotedString 可以包含除单引号之外的任意字符;围绕的单引号被移除。UnquotedString 可以包含除单引号和左花括号之外的任意字符。因此,格式化后消息字符串为 "'{0}'" 的字符串可以写作 "'''{'0}''""'''{0}'''"

SubformatPattern 中,应用了不同的规则。QuotedPattern 可包含除单引号之外的任意字符,但移除围绕的单引号,因此它们可以由子格式解释。例如,"{1,number,$'#',##}" 将产生一个带井号的数字格式,结果如:"$#31,45"。UnquotedPattern 可以包含除单引号之外的任意字符,但其中的花括号必须成对出现。例如,"ab {0} de""ab '}' de" 是有效的子格式模式,而 "ab {0'}' de""ab } de" 则是无效的。

使用MessageFormat时需要注意的是,在消息格式模式中使用引号的规则在一定程度上显示混乱。尤其是,本地化程序并不总是清楚单引号是否需要成对。要确保通知本地化程序关于规则的信息,并告诉它们(例如,通过使用资源包源文件中的注释)MessageFormat 将处理哪些字符串。注意,本地化程序在转换后的字符串中必须使用单引号,其中原始版本不包含单引号。

ArgumentIndex 值是使用数字 '0' 到 '9' 表示的非负整数,它表示传递给format 方法的 arguments 数组的一个索引,或者表示由 parse 方法返回的结果数组的一个索引。

FormatTypeFormatStyle 值用来创建格式元素的Format 实例。下表显示了值如何映射到Format 实例。表中没有显示的组合是非法的。SubformatPattern 必须是所使用的 Format 子类的一个有效的模式字符串。

2.3.4MessageFormat的使用

例子1

例子使用静态的方法 MessageFormat.format,它在内部创建一个只使用一次的 MessageFormat

输出为:

At 3:18:45 on 2012-4-16, there was a disturbance in the Force on planet 7.

例子2

创建一个可以重复使用的MessageFormat 实例:

输出:The disk"MyDisk" contains 1,273 file(s).

例子3

对于更复杂的模式,可以使用 ChoiceFormat 来生成正确的单数和复数形式:

输出为:The disk"MyDisk" contains 1,273 files.

 

从上面的例子可以看到,由 MessageFormat 中的 ChoiceFormat 所生成的字符串要进行特殊处理;'{' 的出现用来指示子格式,并导致递归。如果MessageFormatChoiceFormat 都是以编程方式创建的(而不是使用字符串模式),那么要注意不要生成对其自身进行递归的格式,这将导致无限循环。

例子4

当一个参数在字符串中被多次分析时,最后的匹配将是分析的最终结果。

输出: result1=3.14,3.1

objs=3.1

 

例子5

同样,使用包含同一参数多个匹配项的模式对 MessageFormat 对象进行分析时将返回最后的匹配:

输出:z


主要参考资料:java api

原创粉丝点击