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

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

在使用下列代码的时候,记得要引入java的text和util包

1.首先,我们来谈谈NumberFormat的第一个子类DecimalFormat:

DecimalFormat类的作用是将数值型数据格式化成我们需要的格式的字符串或将字符串数据反格式化为一个Number型对象。例如:

  1. String decimalPattern = "\u00A4#,##0.00"; //\u00A4表示货币字符;#表示数字,0时不显示;0表示数字,0时显示
  2. DecimalFormat df = new DecimalFormat(decimalPattern); //构造DecimalFormat对象
  3. //TO DO...
  4. System.out.println(df.format(4350.3D)); //输出¥4,350.30
  5. System.out.println(df.format(2345)); //输出¥2,345.00
  6. System.out.println(df.parse(df.format(4350.3D))); //输出4350.3
  7.  
  8. //System.out.println(df.parse("1234")); //This will throw a ParseException

上面显示的货币字符在本例中依赖于系统的区域设置,如果我们在中文区域上,要显示美元的货币形式,则需要在上面

//TO DO...位置加上下面语句

  1. DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
  2.  
  3. dfs.setCurrencySymbol("$");
  4.  
  5. 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值 */

  1. double[] limits = {ChoiceFormat.nextDouble(0D, false), 0D, ChoiceFormat.nextDouble(0D, true)};
  2. String[] monthNames = {"负数", "零", "正数"};
  3.  
  4. ChoiceFormat cf = new ChoiceFormat(limits, monthNames);
  5.  
  6. for (double i = 0.0; i <= 4.0; i++) {
  7.  
  8. System.out.print("*" + i + "是一个" + cf.format(i));
  9. }
  10.  
  11. /* 输出:
  12.  
  13. *-4.0是一个负数*-3.0是一个负数*-2.0是一个负数*-1.0是一个负数*0.0是一个零*1.0是一个正数*2.0是一个正数*3.0是一个正数*4.0是一个正数 */
  14.  
  15. System.out.println(cf.parse("零")); //输出:0.0
  16.  
  17. //System.out.println(cf.parse("other")); //This will throw a ParseException

另一构造函数: String pattern = "-1#负数|0#零|0<正数";

//这个位置不能写反,数值大小一定要从小到大,改变参数位置会运行时会抛异常

  1. ChoiceFormat cf2 = new ChoiceFormat(pattern);
  2.  
  3. for (double i = -4.0; i <= 4.0; i++) {
  4.  
  5. System.out.println(i + "是一个" + cf2.format(i));
  6.  
  7. }

//得到与上面例子同样的输出

下面,我们再来看看DateFormat的唯一子类SimpleDateFormat,

这个类可能是我们使用比较多的类,这里只举一个简单的例子:

  1.      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  2. String s = sdf.format(Calendar.getInstance().getTime());
  3. Date d = sdf.parse(s);
  4.  
  5. System.out.println("当前时间是 :" + s); //输出:当前时间是 :当前时间是 :2013-11-07 09:09:48
    System.out.println("当前时间的日期对象是 : " + d); //输出:当前时间的日期对象是 : 当前时间的日期对象是 : Thu Nov 07 09:09:48 CST 2013 
  1.    sdf.setLenient(true); //这句是我在原文的基础上加的。因为我自己运行的时候没有这句就是会报错。
  2. //setLenient用于设置Calendar是否宽松解析字符串,如果为false,则严格解析;默认为true,宽松解析。

最后,我们来看一下Format类中的最后一个非抽象子类MessageFormat,

这个类可以让我们利用匹配规则,非常方便的显示一些字符串,

再不用自己去组合字串了。

该类提供了一个静态的format方法(public static String format(String pattern, Object[] arguments)),

可以让我们比较方便的使用,例如:

  1. 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#公司董事会})";
  2.  
  3. Date d = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2005-10-12 18:10:20");
  4.  
  5. Object[] arguments = {new Double(7825.36), new Double(0.65), new Double(1000),d,d,new Double(1) };
  6.  
  7. System.out.println(MessageFormat.format(pattern, arguments));

/*特大喜讯:公司上半年营业额为7,825.36万元,比去年同期增长65%,公司董事会决定发放奖金每人¥1,000.00元现金(2013-11-07 09:09:48 发布者:公司董事会)*/

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

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

上面内容只是java.text包中有关Format的部分功能,与CharacterIterator接口有关的部分。

本文转自http://blog.sina.com.cn/s/blog_49d2f09d01000bab.html

但是也是在原文的基础上修改了一些东西。

我是java新手。在这个方面需要大家的多多指导才是啊!

java.text包的更多相关文章

  1. 由Double类型数据到数据的格式化包java.text

    需求:Double类型数据截取操作保留两位小数 解决方案: java.text.DecimalFormat df =new java.text.DecimalFormat("#.00&quo ...

  2. java util包概述

    util是utiliy的缩写,意为多用途的,工具性质的包这个包中主要存放了:集合类(如ArrayList,HashMap等),随机数产生类,属性文件读取类,定时器类等类.这些类极大方便了Java编程, ...

  3. java.util包详解

    介绍Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结构.本章介绍Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结 ...

  4. Date类(java.util)和SimpleDateFormat类(java.text)

    在程序开发中,经常需要处理日期和时间的相关数据,此时我们可以使用 java.util 包中的 Date 类.这个类最主要的作用就是获取当前时间,我们来看下 Date 类的使用: 使用 Date 类的默 ...

  5. java关键包简易说明

    java.lang 语言核心类,系统自动导入. java.util   java工具类.集合框架.时间,日历等. java.net   网络编程接口和类. java.io 流的接口和类 java.te ...

  6. 编码神器——Sublime Text 包管理工具及扩展大全

    Sublime Text 是程序员们公认的编码神奇,拥有漂亮的用户界面和强大的功能,例如代码缩略图,多重选择,快捷命令等.还可自定义键绑定,菜单和工具栏.Sublime Text 的主要功能包括:拼写 ...

  7. java常用包

    java的核心类都放在java这个包以及其子包下,java扩展的许多类都放在javax包以及其子包下.这些实用类也就是平时经常说的API(应用程序接口). 以下几个是java语言中常用包 java.l ...

  8. Java网络编程:利用Java mail包发送电子邮件

    下面代码是利用Java mail包封装了一个发送邮件的类 import java.io.File; import java.util.ArrayList; import java.util.Date; ...

  9. java.text.MessageFormat格式化字符串时的小技巧

    java.text.MessageFormat格式化字符串时的小技巧 public static void main(String[] args) throws InterruptedExceptio ...

随机推荐

  1. REST格式

    首先要明确一点:REST 实际上只是一种设计风格,它并不是标准.(所以你可以看到网上一大堆的各种最佳实践,设计指南,但是没有人说设计标准).aisuhua/restful-api-design-ref ...

  2. 团队项目第六周——事后诸葛亮分析(GG队)

    一.总结: 本次项目作为我们第一次团队集体开发的项目,使我们在项目开发以及团队合作方面都有了宝贵的 经验以及初步的认识: 从项目开发的方面来看: 通过本次项目,我们更进一步加强了自己的前端知识,并初步 ...

  3. [翻译]CSS3 Media Queries

    Media Queries Official Manual:http://www.w3.org/TR/css3-mediaqueries/ 原文链接:http://www.smashingmagazi ...

  4. Android-AndroidManifest.xml默认启动的Activity(探索篇01)

    AndroidManifest.xml-->默认启动  MusicBrowserActivity <activity android:name=".MusicBrowserAct ...

  5. RequestHelper

    Request["param"] 全部 Request.QueryString["param"] get Request.Form["param&qu ...

  6. .netcore部署centos

    前言:最近公司有个项目用 .netcore开发的项目,然后闲的没事就研究如果发布到Linux系统上 需要安装的插件以及支撑架构 1.dotnetSDK 2.jexus Jexus 是Linux平台上 ...

  7. CC2530学习路线-基础实验-GPIO 按键控制LED灯亮灭(2)

    目录 1.前期预备知识 1.1 新大陆Zigbee模块按键电路图 1.2 CC2530相关寄存器 1.3 CC2530中断走向图 1.4 使用C语言为51单片机编写中断程序 1.5 *函数指针 2. ...

  8. CEPH 创建 RPM 安装包

    1.安装依赖环境 yum install gcc make python-devel openssl-devel graphviz autoconf automake rpm-build redhat ...

  9. elasticsearch 导入基础数据并索引之 geo_point

    elasticsearch 中的地理信息存储, 有geo_point形式和geo_shape两种形式 此篇只叙述geo_point, 地理位置需要声明为特殊的类型, 不显示在mapping中定义的话, ...

  10. Flask从入门到精通之大型程序的结构二

    一.程序包 程序包用来保存程序的所有代码.模板和静态文件.我们可以把这个包直接称为app(应用),如果有需求,也可使用一个程序专用名字.templates 和static 文件夹是程序包的一部分,因此 ...