一、前言                              

刚开始从.net的转向java的时候总觉得 String.format 用得不习惯,希望格式模版会这样 {}, this is {}'s cat.{1},this is {0}'s dog. 而不是 %$s,this is %$s's cat.%2$s,this is %1$s's dog. 。后来发现 java.text.MessageFormat.format 可以满足我这个小小的愿望。

二、静态方法 java.text.MessageFormat.format                 

方法定义:

String MessageFormat.format(String fmt, Object...args)

入参fmt为MessageFormat模式参数。

三、MessageFormat模式                      

格式:  ArgumentIndex[,FormatType[,FormatStyle]]

ArgumentIndex ,是从0开始的入参位置索引。

FormatType ,指定使用不同的Format子类对入参进行格式化处理。值范围如下:

number:调用NumberFormat进行格式化

date:调用DateFormat进行格式化

time:调用DateFormat进行格式化

choice:调用ChoiceFormat进行格式化

FormatType ,设置FormatType中使用的格式化样式。值范围如下:

short,medium,long,full,integer,currency,percent,SubformPattern(子格式模式,形如#.##)

注意: FormatType 和 FormatStyle 主要用于对日期时间、数字、百分比等进行格式化。

示例——将数字1.23格式为1.2:

double num = 1.23;
String str = MessageFormat.format("{0,number,#.#}", num);

四、MessageFormat注意点                    

1. 两个单引号才表示一个单引号,仅写一个单引号将被忽略。

2. 单引号会使其后面的占位符均失效,导致直接输出占位符。

MessageFormat.format("{0}{1}", , ); // 结果12
MessageFormat.format("'{0}{1}", , ); // 结果{0}{1}
MessageFormat.format("'{0}'{1}", , ); // 结果{0}

因此可以用于输出左花括号(单写左花括号会报错,而单写右花括号将正常输出)

MessageFormat.format("'{'{0}}", ); // 结果{2

因此前言中的示例应该写为

{}, this is {}''s cat.{},this is {}''s dog.

五、类层级关系                                

|-- java.text.MessageFormat

顶层抽象类java.text.Format—|                                         |--java.text.ChoiceFormat

|--java.text.NumberFormat—|

               |               |--java.text.DecimalFormat

               |

|--java.text.DateFormat—java.text.SimpleDateFormat

   1. DecimalFormat

用于格式化十进制实数。通过格式字符串来自定义格式化类型,舍入方式为half-even(四舍五入)。

格式化模式: 正数子模式;负数子模式 ,如 0.00;-0.00 ,简写为 0.00 。

模式中的占位符:

      ,代表该为位为数字,若不存在则用0填充

        # ,代表该为位为数字

     , ,代表分隔符, 如模式为 #,# ,那么格式化10时会返回1,0

   2. ChoiceFormat

  相当于以数字为键,字符串为值的键值对。分别使用一组double类型的数组作为键,一组String类型的数组作为值,两数组相同索引值的元素作为一对。

    示例——基本用法

double[] limit = {,,};
String[] format = {"hello0", "hello1", "hello3"};
ChoiceFormat cf = new ChoiceFormat(limit, format);
for(int i = ; i < ; ++i){
System.out.println(cf.format(i));
}
/* 输出
* hello0
* hello1
* hello0
* hello3
*/

注意:当找不到对应的键值对时,则使用第一或最后一对键值对。

   示例——结合MessageFormat使用

double[] limit = {, };
String[] format = {"Hello0", "Hello1{1}"};
ChoiceFormat cf = new ChoiceFormat(limit, format);
MessageFormat mf = new MessageFormat("{0}");
mf.setFormatByArgumentIndex(, cf);
for (int i = ; i < ; ++i){
System.out.println(mf.format(new Object[]{new Integer(i), new Integer(i+)}));
}
/* 输出
* Hello0
* Hello12
*/

六、性能问题                                  

由于静态方法 MessageFormat.format 内部是

public static String format(String pattern, Object ... arguments)
{
MessageFormat temp = new MessageFormat(pattern);
return temp.format(arguments);
}

因此若要多次格式同一个模式的字符串,那么创建一个MessageFormat实例在执行格式化操作比较好些。

七、总结                                  

对于简单的格式化或字符串组装, MessageFormat.format方法 使用更方便些,但要格式化处理更丰富的话要是用 String.format方法 吧!

尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/4095059.html  ^_^肥仔John

八、参考                                  

http://zqc-0101.iteye.com/blog/114014

Java魔法堂:初探MessageFormat.format和ChoiceFormat的更多相关文章

  1. 【转】Java魔法堂:String.format详解

    Java魔法堂:String.format详解     目录     一.前言    二.重载方法     三.占位符     四.对字符.字符串进行格式化     五.对整数进行格式化     六. ...

  2. Java魔法堂:String.format详解

      目录     一.前言    二.重载方法     三.占位符     四.对字符.字符串进行格式化     五.对整数进行格式化     六.对浮点数进行格式化     七.对日期时间进行格式化 ...

  3. Java魔法堂:类加载器入了个门

    一.前言 <Java魔法堂:类加载机制入了个门>中提及整个类加载流程中只有加载阶段作为码农的我们可以入手干预,其余均由JVM处理.本文将记录加载阶段的核心组件——类加载器的相关信息,以便日 ...

  4. Java魔法堂:打包知识点之jar

    一.前言    通过eclipse导出jar包十分方便快捷,但作为码农岂能满足GUI的便捷呢?所以一起来CLI吧! 二.JAR包 JAR包是基于ZIP文件格式,用于将多个.java文件和各种资源文件, ...

  5. Java魔法堂:Date与日期时间格式化

    一.前言                                                                                       日期时间的获取.显 ...

  6. Java魔法堂:调用外部程序

    前言 Java虽然五脏俱全但总有软肋,譬如获取CPU等硬件信息,当然我们可以通过JNI调用C/C++来获取,但对于对C/C++和Windows API不熟的码农是一系列复杂的学习和踩坑过程.那能不能通 ...

  7. Java魔法堂:枚举类型详解

    一.前言 Java的枚举类型相对C#来说具有更灵活可配置性,Java的枚举类型可以携带更多的信息. // C# enum MyColor{ RED = , BLUE = } Console.Write ...

  8. Java魔法堂:解读基于Type Erasure的泛型

    一.前言 还记得JDK1.4时遍历列表的辛酸吗?我可是记忆犹新啊,那时因项目需求我从C#转身到Java的怀抱,然后因JDK1.4少了泛型这样语法糖(还有自动装箱.拆箱),让我受尽苦头啊,不过也反映自己 ...

  9. Java魔法堂:类加载机制入了个门

    一.前言 当在CMD/SHELL中输入 $ java Main<CR><LF> 后,Main程序就开始运行了,但在运行之前总得先把Main.class及其所依赖的类加载到JVM ...

随机推荐

  1. jsp中表格,表格中的文字根据表格的大小自动换行

    style="table-layout: fixed;WORD-BREAK: break-all; WORD-WRAP: break-word" 语法: word-break : ...

  2. 国内市场上 Android 手机屏幕分辨率的比例情况如何?

    http://www.zhihu.com/question/19587205 根据友盟发布的<友盟国内Android数据报告>,前六名分别是: 800×480,32.4% 480×320, ...

  3. Javascript 固定表格表头

    遇到一个简单的需求: 客户有一个表格可能有很多内容,当内容很多的时候,表格就会出现滚动条 客户希望当表格内容很多时,只滚动表格而不滚动浏览器窗口 在网上找到很多相关的插件,要不就是太复杂,要不就是满足 ...

  4. easyui datagrid去掉加载提示

    掉这个等待效果的方法:查了easyui的api,datagrid没有去掉这个遮罩层的方法或者属性,在网上找了半天也没人碰到相同的问题(可能比较easy就解决了吧).还好easyui是开源的,就研究它的 ...

  5. Gradle中ProGuard的配置

    好久没有写博客了…元旦前赶紧写一篇吧… 这些日子琢磨了一下gradle.对比起maven确实在配置上灵活很多,对groovy的支持可以更容易的自定义任务. 由于最近的几个项目中都使用到了moco这个开 ...

  6. Xshell中文乱码问题

    1.  先查看当前使用的语言: echo $LANG 2.  查看系统的语言安装包: locale 3.  如果没有中文安装包(包含zh_CN字样),需要网络或者自己上传安装包,安装 4.  有了中文 ...

  7. Win8.1 远程桌面 凭据无法工作

    最近遇到一个杯具的事情 电脑重装完系统后,发现 win7/server08/server12 无法远程到我的电脑了- 每次连接都显示如下:   灵异的是从 xp 和 server03 能远程进来-   ...

  8. 为MFC界面添加一个Log Window

    前言 由于早期的图像处理程序基于VC6.0,MFC也是采用VC6.0开发的.在实际处理中,我不仅需要界面的显示,有很多时候,我需要算法处理的过程中的信息,比如每个阶段的耗时,处理的图像大小,以及如果需 ...

  9. struts2:struts.xml配置文件详解

    1. 几个重要的元素 1.1 package元素 package元素用来配置包.在Struts2框架中,包是一个独立的单位,通过name属性来唯一标识包.还可以通过extends属性让一个包继承另一个 ...

  10. Rails: No such file or directory - getcwd

    这个的意思就是你从一个删除的目录里面运行实例:rails s