加载中…
个人资料
Annila
Annila
  • 博客等级:
  • 博客积分:0
  • 博客访问:17,693
  • 关注人气:8
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

JDK功能之java.text包

(2007-10-11 16:32:05)
标签:

知识/探索

 

JDK在java.text包中,提供了对显示对象格式化的接口、类及异常处理,这里我们只来谈一谈text包中的format类及其子类。其中,最重要的是两个差不多互为“逆运算”的方法format(将某对象按设定格式化为字符串)与parse(将字符串反格式化为对象)。


java.text.Format是一个抽象类,下面有三个子类:NumberFormat, DateFormat及MessageFormat,NumberFormat与DateFormat又是两个抽象类。

首先,我们来谈谈NumberFormat的第一个子类DecimalFormat:
DecimalFormat类的作用是将数值型数据格式化成我们需要的格式的字符串或将字符串数据反格式化为一个Number型对象。例如:
String decimalPattern = "\u00A4#,##0.00";  //\u00A4表示货币字符;#表示数字,0时不显示;0表示数字,0时显示
DecimalFormat df = new DecimalFormat(decimalPattern);  //构造DecimalFormat对象
//TO DO...
System.out.println(df.format(4350.3D));  //输出¥4,350.30
System.out.println(df.format(2345));     //输出¥2,345.00
System.out.println(df.parse(df.format(4350.3D)));  //输出4350.3
//System.out.println(df.parse("1234"));  //This will throw a ParseException

上面显示的货币字符在本例中依赖于系统的区域设置,如果我们在中文区域上,要显示美元的货币形式,则需要在上面//TO DO...位置加上下面语句
DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
dfs.setCurrencySymbol("$");
df.setDecimalFormatSymbols(dfs);
此时,输出变为$4,350.30与$2,345.00

接下来,我们来看看NumberFormat的另一个子类ChoiceFormat:
ChoiceFormat类可以将数值型数据转化为我们需要显示的字符串,或将一个字符串转换为一个Number型对象,需要注意的是,该类对数据的转换并不是精确匹配。
该类有两个构造函数
public ChoiceFormat(double[] limits, String[] formats);
public ChoiceFormat(String newPattern);
两者实现方式稍有不同,例如:
double[] limits = {ChoiceFormat.nextDouble(0D, false), 0D, ChoiceFormat.nextDouble(0D, true)};
/* ChoiceFormat.nextDouble(0D, false)与ChoiceFormat.previousDouble(0D)意义一样,表示比0小的最大Double值,同样ChoiceFormat.nextDouble(0D, true)与ChoiceFormat.nextDouble(0D)意义相同,表示比0大的最小Double值
*/
String[] monthNames = {"负数", "零", "正数"};
ChoiceFormat cf = new ChoiceFormat(limits, monthNames);
for (double i = 0.0; i <= 4.0; i++) {
    System.out.print("*" + i + "是一个" + cf.format(i));
/* 输出:
*-4.0是一个负数*-3.0是一个负数*-2.0是一个负数*-1.0是一个负数*0.0是一个零*1.0是一个正数*2.0是一个正数*3.0是一个正数*4.0是一个正数
*/
}
System.out.println(cf.parse("零"));  //输出:0.0
//System.out.println(cf.parse("other"));  //This will throw a ParseException

另一构造函数:
String pattern = "-1#负数|0#零|0<正数";  //这个位置不能写反,数值大小一定要从小到大,改变参数位置会运行时会抛异常
ChoiceFormat cf2 = new ChoiceFormat(pattern);
for (double i = -4.0; i <= 4.0; i++) {
    System.out.println(i + "是一个" + cf2.format(i));  //得到与上面例子同样的输出
}

下面,我们再来看看DateFormat的唯一子类SimpleDateFormat,这个类可能是我们使用比较多的类,这里只举一个简单的例子:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = sdf.format(Calendar.getInstance().getTime());
Date d = sdf.parse(s);
 
System.out.println("当前时间是 :" + s);  //输出:当前时间是 :2005-10-13 11:00:39
System.out.println("当前时间的日期对象是 : " + d); //输出:当前时间的日期对象是 : Thu Oct 13 11:00:39 CST 2005

最后,我们来看一下Format类中的最后一个非抽象子类MessageFormat,这个类可以让我们利用匹配规则,非常方便的显示一些字符串,再不用自己去组合字串了。
该类提供了一个静态的format方法(public static String format(String pattern, Object[] arguments)),可以让我们比较方便的使用,例如:
String pattern = "特大喜讯:公司上半年营业额为{0, number,#,##0.00}万元,"
   + "比去年同期增长{1, number, percent},公司董事会决定发放奖金每人"
   + "{2, number, currency}元现金"
   + "({3, date,yyyy-MM-dd} {4, time,HH:mm:ss} 发布者:{5, choice,0#系统信息|1#公司董事会})";
Date d = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2005-10-12 18:10:20");
Object[] arguments = {
    new Double(7825.36)
  , new Double(0.65)
  , new Double(1000)
  , d
  , d
  , new Double(1)
};
System.out.println(MessageFormat.format(pattern, arguments));
/*输出:
特大喜讯:公司上半年营业额为7,825.36万元,比去年同期增长65%,公司董事会决定发放奖金每人¥1,000.00元现金(2005-10-12 18:10:20 发布者:公司董事会)
*/

需要提一下的是,对于匹配字符串{id, type,pattern} ,在使用自定义的pattern时,实际进行匹配的匹配符是从type后面的逗号后开始,一直到最后的大括号前面结束,所以最好在逗号与pattern之间不要有空格存在,否则转换出的字符串中,前面将会出现相应数量的空格;另外一定要注意,pattern位置的字串不需要引号(加上引号后匹配结果外面将会出现一对引号)

该类的匹配规则稍微复杂些,具体内容参考下JDK文档就OK了。

上面内容只是java.text包中有关Format的部分功能,与CharacterIterator接口有关的部分,以及ParsePosition类的用法,我理解的也不是很透彻,想写些东西,但是却不知该从哪写起,哪位朋友比较熟悉,麻烦跟个贴子啊,呵呵。


 

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有