一、前言                              

刚开始从.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. CCNA实验4:HDLC和PPP

    一.HDLC封装 router9和11上分别配置s0/0如下 conf t int s0/0 encapsulation hdlc do show int s0/0 ip address x.x.x. ...

  2. IOC性能对比

  3. MySQL的慢查询分析

    慢查询分析日最初是用来捕获比较“慢”的查询,在mysql5.1 + 版本中,慢查询的功能被加强,可以通过设置long_query_time为0来捕获所有的查询,而且查询的响应时间已经可以做到微妙级别. ...

  4. APK重签名总结

    keytool -genkey -alias aeo_android.keystore -keyalg RSA -validity 20000 -keystore aeo_android.keysto ...

  5. 使用commons-beanutils迭代获取javabean的属性

    NoteEntity entity = new NoteEntity(); entity.setNote001("a1"); entity.setNote002("a2& ...

  6. python排序算法的实现-插入

    1.算法: 设有一组关键字{ K 1 , K 2 ,…, K n }:排序开始就认为 K 1 是一个有序序列:让 K 2 插入上述表长为 1 的有序序列,使之成为一个表长为 2 的有序序列:然后让 K ...

  7. 匿名对象和object的转换

    有时候经常用到需要把一个匿名对象存入session或List<object>或其他容器中,可是取出来的时候变成object了,不太方便使用. 下面是一种转换方式:     class Pr ...

  8. 转:NO.523 Aidan Hawken&Carina Round - Walking Blind

    NO.523 Aidan Hawken&Carina Round - Walking Blind 好像是好几天没来更新过 也没有找歌 因为这几天一直在追美剧 吸血鬼日记 好不容易 今天追到了第 ...

  9. MyEclipse设置编码方式

    1.windows->Preferences……打开"首选项"对话框,左侧导航树,导航到general->Workspace, 右侧Text file encoding ...

  10. 使用Xcode6.1.1打包出现Your account already has a valid iOS Distribution certificate问题

    1.问题描述: 使用客户证书在Xcode6.1.1上进行打包测试,出现如下问题,查看网上也很多类似错误且解决办法各异. 2.我的解决办法: 让客户将开发.发布证书重新revoke掉之后重新创新并给到p ...