MessageFormat类
动态的拼接一个字符串时,经常需要写String info="I am"+num+"years old";这样的代码,如果需要拼接的字符串较多时,这样的格式看起来会比较麻烦,为了解决这个问题,JDK提供了一个MessageFormat类,该类提供了一种用参数替换模式字符串中的占位符的方式,它将根据模式字符串中包含的占位符产生一系列的格式化对象,然后调用这些格式化对象对参数进行格式化,并将格式化后的结果字符串插入到模式字符串中的适当位置。接下来将针对MessageFormat类进行详细地讲解。
1、模式化字符串与占位符
MessageFormat类操作模式字符串,通常情况下都是包含占位符的,如下所示:
On {0},there was {1} on planet {2}.
上述的模式字符串中,花括号以及花括号内的数字被称为占位符,如{0}、{1},这些占位符都会被MessageFormat格式化的参数所代替。
2、MessageFormat类格式化模式字符串
通过前面的讲解,我们知道MessageFormat类可以格式化模式字符串,接下来就分步骤为大家讲解如何使用MessageFormat格式化模式字符串。
(1)创建MessageFormat对象
在使用MessageFormat格式化模式字符串之前,首先需要创建MessageFormat对象。MessageFormat类提供了两个构造方法,它们的语法定义如下:
● public MessageFormat(String pattern)
● public MessageFormat(String pattern, Locale locale)
上述的两个构造方法都可以创建MessageFormat对象,其中,第一个构造方法需要在创建MessageFormat对象时传递一个模式字符串的参数,第二个构造方法,不仅需要传递模式字符串的参数,还需要传递一个Locale对象,用于指定按照某个本地环境对模式字符串进行格式化。通常情况下,选择使第一个构造方法创建MessageFormat对象。
(2)调用MessageFormat对象的format()方法
MessageFormat有一个format()方法,该方法用于执行模式字符串的格式化操作,在调用format()方法时,需要传递一个Object类型的参数数组,数组中的每个元素分别用于替换模式字符串中与其索引对应的占位符。
接下来我们就按照上面的步骤,来完成MessageFormat类对模式字符串的格式化操作,如例1所示。
例1 MessageFormatExam.java
1 package cn.itcast.chapter10;
2 import java.text.*;
3 public class MessageFormatExam {
4 public static void main(String[] args) {
5 String pattern = "On {0},{1} destroyed {2} houses "
6 + "and caused {3} of damage.";
7 Object[] msgArgs = {"2010.11.03", "a hurricance", "100", "2000000"};
8 MessageFormat mf = new MessageFormat(pattern);
9 String result = mf.format(msgArgs);
10 System.out.println(result);
11 }
12 }
运行MessageFormatExam.java程序,此时,控制台窗口中显示的结果如图1所示。
图1 控制台窗口
从图1可以看出,控制台窗口输出了一个完整的字符串。这是因为在例10-5中,首先定义了一个模式字符串和一个Object类型的参数数组,然后在创建MessageFormat对象时,将模式字符串作为参数传递给它,最后调用MessageFormat对象的format()方法传递一个Object类型的数组,并根据格式化的数据在数组中的索引来替换对应的占位符,这样便完成了模式字符串的格式化。
3、加强对MessageFormat的学习
前面我们讲解过,占位符是用花括号和一个数字来表示,实际上,这种形式只是占位符中的一种,占位符总共有三种形式,具体如下:
● { ArgumentIndex }
● { ArgumentIndex , FormatType }
● { ArgumentIndex, FormatType, FormatStyle }
其中,ArgumentIndex表示要格式化的数据在参数数组中的索引,这个索引是由0-9之间的数字组成;FormatType表示参数的格式化类型,它的值可以是number、date、time、choice四种,如{1,date};FormatStyle表示指定的格式化类型下的某种模式,它的值是与对应格式化类型匹配的合法模式或字符串,假设将格式化类型指定为number,则FormatStyle的值可以是integer、currency、percent等,如{2,number,integer}。关于FormatStyle的具体值可以查阅Java API,这里就不一一列举了。
为了加强对MessageFormat的学习,接下来通过一个具体的案例来演示MessageFormat格式化使用不同占位符的模式字符串,如例1所示。
例1 MessageFormatExam1.java
1 package cn.itcast.chapter10;
2 import java.text.MessageFormat;
3 import java.util.Date;
4 public class MessageFormatExam1 {
5 public static void main(String[] args) {
6 String pattern = "At {0,time} on {0,date}, {1} destroyed "
7 + "{2,number,integer} houses and caused {3} of damage.";
8 Object[] msgArgs = { new Date(System.currentTimeMillis()),
9 "a hurricance", new Integer(7), new Double(2000000) };
10 MessageFormat mf = new MessageFormat(pattern);
11 String result = mf.format(msgArgs);
12 System.out.println(result);
13 }
14 }
在Eclipse中运行MessageFormatExam1.java程序,此时,控制台窗口中显示的结果如图2所示。
图2 控制台窗口
从图2可以看出,在控制台窗口中同样输出了一个完整的字符串。这是因为在例1中,定义了一个模式字符串和一个Object类型的参数数组,在模式字符串中使用了相同的占位符,并且指定了占位符的格式化类型以及对应的模式,在使用数组中的元素替换重复的占位符时,msgArgs数组中的第一个元素new Date(System.currentTimeMillis())对象中的时间和日期会分别替换{0,time}和{0,date},其它的占位符也会被对应的替换。
脚下留心:
在使用MessageFormat对象格式模式字符串时,如果字符串中要使用单引号将某个字符引起来,则需要使用两个单引号,一个单引号会被忽略,示例代码如下:
String message = "oh, this is ''a'' {0}";
Object[] array = new Object[]{"cat"};
String value = MessageFormat.format(message, array);
System.out.println(value);
输出结果如下:
oh, this is 'a' cat