Java魔法堂:初探MessageFormat.format和ChoiceFormat

一、前言                              

  刚开始从.net的转向java的时候总觉得 String.format 用得不习惯,希望格式模版会这样 {0}, this is {1}'s cat.{1},this is {0}'s dog. 而不是 %1$s,this is %2$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}", 1, 2); // 结果12
MessageFormat.format("'{0}{1}", 1, 2); // 结果{0}{1}
MessageFormat.format("'{0}'{1}", 1, 2); // 结果{0}

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

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

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

{0}, this is {1}''s cat.{1},this is {0}''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 ,代表该为位为数字,若不存在则用0填充

         # ,代表该为位为数字

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

   2. ChoiceFormat

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

    示例——基本用法

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

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

   示例——结合MessageFormat使用


double[] limit = {0, 1};
String[] format = {"Hello0", "Hello1{1}"};
ChoiceFormat cf = new ChoiceFormat(limit, format);
MessageFormat mf = new MessageFormat("{0}");
mf.setFormatByArgumentIndex(0, cf);
for (int i = 0; i < 2; ++i){
    System.out.println(mf.format(new Object[]{new Integer(i), new Integer(i+1)}));
}
/* 输出
 * 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方法 吧!  

时间: 2024-09-14 03:56:46

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

Java魔法堂:String.format详解-

  目录     一.前言     二.重载方法     三.占位符     四.对字符.字符串进行格式化     五.对整数进行格式化     六.对浮点数进行格式化     七.对日期时间进行格式化     八.其他转换符     九.总结     参考   一.前言    String.format 作为文本处理工具,为我们提供强大而丰富的字符串格式化功能,为了不止步于简单调用 String.format("Hello %s", "John"); ,下面将笔记

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

一.前言   <Java魔法堂:类加载机制入了个门>中提及整个类加载流程中只有加载阶段作为码农的我们可以入手干预,其余均由JVM处理.本文将记录加载阶段的核心组件--类加载器的相关信息,以便日后查阅.若有纰漏请大家指正,谢谢.   注意:以下内容基于JDK7和HotSpot VM.   二.类加载器种类及其关系 从上图可知Java主要有4种类加载器 1. Bootstrap ClassLoader(引导类加载器):作为JVM的一部分无法在应用程序中直接引用,由C/C++实现(其他JVM可能通过

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

一.前言      通过eclipse导出jar包十分方便快捷,但作为码农岂能满足GUI的便捷呢?所以一起来CLI吧!   二.JAR包   JAR包是基于ZIP文件格式,用于将多个.java文件和各种资源文件,或将多个.class和各种资源打包为一个文件.用于发布,部署,封装库.组件和插件程序,从而被编译器和JVM使用.   三.通过jar命令打包     1. 格式 jar [option]* 文件名        必选选项(并且仅能选用其中一个)        -c ,创建一个jar包  

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

一.前言                                                                                           日期时间的获取.显示是每个程序都会涉及到的,下面是一些记录以便日后查阅.   二. java.util.Date类  // 当前日期时间 Date now = new Date(); /* 由于程序的默认时区不同,可能显示如下内容: * 1. 格林尼治时间,Tue Oct 28 01:24:14 GMT 20

Java魔法堂:注解用法详解——@SuppressWarnings

一.前言   编码时我们总会发现如下变量未被使用的警告提示:   上述代码编译通过且可以运行,但每行前面的"感叹号"就严重阻碍了我们判断该行是否设置的断点了.这时我们可以在方法前添加 @SuppressWarnings("unused") 去除这些"感叹号".   二. @SuppressWarings注解    作用:用于抑制编译器产生警告信息.   示例1--抑制单类型的警告: @SuppressWarnings("unchecke

Java魔法堂:枚举类型详解

一.前言   Java的枚举类型相对C#来说具有更灵活可配置性,Java的枚举类型可以携带更多的信息. // C# enum MyColor{ RED = 0, BLUE = 1 } Console.Write(MyColor.RED); // Java enum MyColor{ RED("Hot", 4), BLUE("SAD",8); private String mood; public String getMood{ return mood; } priv

Java魔法堂:URI、URL(含URL Protocol Handler)和URN

一.前言   过去一直搞不清什么是URI什么是URL,现在是时候好好弄清楚它们了!本文作为学习笔记,以便日后查询,若有纰漏请大家指正!   二.从URI说起    1. 概念   URI(Uniform Resource Identifier,统一资源标识符)以字符串来表示某种资源的统一资源标识.   格式为: [scheme:]scheme-specific-part[#fragment]    [scheme:]组件 ,URI的名称空间标识.   scheme-specific-part组件

Java魔法堂:JVM的运行模式 (转)

  一.前言   JVM有Client和Server两种运行模式.不同的模式对应不同的应用场景,而JVM也会有相应的优化.本文将记录JVM模式的信息,以便日后查阅.   二.介绍   在$JAVA_HOME/jre/bin下有client目录,分别代表JVM的两种运行模式.   client运行模式,针对桌面应用,加载速度比server模式快10%,而运行速度为server模式的10分之一.client下默认的堆容量 -Xms1M -Xmx64M   server运行模式,针对服务器应用.ser

Java魔法堂:finalize函数

一.finalize与GC   在GC第一次进行可达性分析时会将不可达而且该对象所属类重写finalize方法和finalize方法重未被执行过的 对象追加到F-Queue当中,然后JVM会自动开启一个低优先级的守护线程Finalizer执行F-Queue中元素的finalize方法.此时可 通过finalize方法重新将不可达对象与引用链关联起来,那么在GC第二次进行可达性分析时,则可逃离被回收的名单. class FinalizeEscapeGC{ public static Finaliz