Java魔法堂:初探MessageFormat.format和ChoiceFormat
一、前言
刚开始从.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的更多相关文章
- 【转】Java魔法堂:String.format详解
Java魔法堂:String.format详解 目录 一.前言 二.重载方法 三.占位符 四.对字符.字符串进行格式化 五.对整数进行格式化 六. ...
- Java魔法堂:String.format详解
目录 一.前言 二.重载方法 三.占位符 四.对字符.字符串进行格式化 五.对整数进行格式化 六.对浮点数进行格式化 七.对日期时间进行格式化 ...
- Java魔法堂:类加载器入了个门
一.前言 <Java魔法堂:类加载机制入了个门>中提及整个类加载流程中只有加载阶段作为码农的我们可以入手干预,其余均由JVM处理.本文将记录加载阶段的核心组件——类加载器的相关信息,以便日 ...
- Java魔法堂:打包知识点之jar
一.前言 通过eclipse导出jar包十分方便快捷,但作为码农岂能满足GUI的便捷呢?所以一起来CLI吧! 二.JAR包 JAR包是基于ZIP文件格式,用于将多个.java文件和各种资源文件, ...
- Java魔法堂:Date与日期时间格式化
一.前言 日期时间的获取.显 ...
- Java魔法堂:调用外部程序
前言 Java虽然五脏俱全但总有软肋,譬如获取CPU等硬件信息,当然我们可以通过JNI调用C/C++来获取,但对于对C/C++和Windows API不熟的码农是一系列复杂的学习和踩坑过程.那能不能通 ...
- Java魔法堂:枚举类型详解
一.前言 Java的枚举类型相对C#来说具有更灵活可配置性,Java的枚举类型可以携带更多的信息. // C# enum MyColor{ RED = , BLUE = } Console.Write ...
- Java魔法堂:解读基于Type Erasure的泛型
一.前言 还记得JDK1.4时遍历列表的辛酸吗?我可是记忆犹新啊,那时因项目需求我从C#转身到Java的怀抱,然后因JDK1.4少了泛型这样语法糖(还有自动装箱.拆箱),让我受尽苦头啊,不过也反映自己 ...
- Java魔法堂:类加载机制入了个门
一.前言 当在CMD/SHELL中输入 $ java Main<CR><LF> 后,Main程序就开始运行了,但在运行之前总得先把Main.class及其所依赖的类加载到JVM ...
随机推荐
- Android 组件系列-----Activity的传值和回传值
在这篇随笔里将讲解Activity的传值和回传值. 一.通过startActivity来进行Activity的传值 在Android中,如果我们要通过一个Activity来启动另一个Activity, ...
- [算法导论]merge sort @ Python
import sys class mergesort(): def merge_sort(self, A, p, r): if p < r: q = (p + r) / 2 self.merge ...
- 新建一个Activity
如果只是新建一个class,还得自己添加XML,好不麻烦: eclipse里可以直接new other Andriod activity,ADT还是很强发滴.哈哈.
- <后会无期>经典影评
先说明是转载,任何不同意见请对原作者表达,楼主不作任何回应,楼主影商极低,楼主觉得这二十几年来看的最好的电影是<一代宗师>,楼主只是觉得这篇影评精彩才发布上来让更多的人看到.原作者意见和楼 ...
- Cocos2d中使用颜色混合:加算,减算
转自http://blog.sina.com.cn/s/blog_7a2ffd5c0100xtid.html CCSprite有一个ccBlendFunc类型的blendFunc_结构体成员,可以用来 ...
- 导出Redis某个列表所有数据的语句
echo "smembers done:www.huaihua.gov.cn" | redis-cli -h 127.0.0.1 >> /home/dz/fkw.d ...
- LINUX系统下添加映射存储LUN
LINUX系统下添加映射存储LUN(无需重启) 背景:Oracle rac环境 添加新实例,重新划分存储空间,从存储映射新的LUN. 问题:映射后,linux操作系统无法识别新的LUN,不能重启系统, ...
- RAID卡
简单的说,RAID是一种把多块独立的物理硬盘按不同方式组合起来形成一个逻辑硬盘,从而提供比单个硬盘有着更高的性能和提供数据冗余的技术. RAID卡一般分为硬RAID卡和软RAID卡两种 ...
- PowerShell定时记录操作系统行为
作为系统管理员,有些时候是需要记录系统中的其他用户的一些操作行为的,例如:当系统管理员怀疑系统存在漏洞,且已经有被植入后门或者创建隐藏账户时,就需要对曾经登陆的用户进行监控,保存其打开或者操作过的文件 ...
- SAP ECC CO 配置
SAP ECC 6.0 Configuration Document Controlling (CO) Table of Content TOC \o \h \z 1. Enterprise Stru ...