MessageFormat用来格式化一个消息,通常是一个字符串,比如:

String str = "I'm not a {0}, age is {1,number,short}", height is {2,number,#.#};

而MessageFormat可以格式化这样的消息,然后将格式化后的字符串插入到模式中的适当位置,比如:

将str中的{0}用"pig"替换,{1,number,short}用数字8替换,{2,number,#.#}用数字1.2替换。

那么最终用户得到的是一个格式化好的字符串"I'm not a pig, age is 8, height is 1.2"。

MessageFormat本身与语言环境无关,而与用户提供给MessageFormat的模式和用于已插入参数的子格式模式有关,以生成适用于不同语言环境的消息。

MessageFormat模式(主要部分):

FormatElement:
         { ArgumentIndex }
         { ArgumentIndex , FormatType }
         { ArgumentIndex , FormatType , FormatStyle }

FormatType
         number

date

time

choice(需要使用ChoiceFormat)

 FormatStyle:
         short
         medium
         long
         full
         integer
         currency
         percent
         SubformatPattern(子模式)

还以str为例,在这个字符串中:

1、{0}和{1,number,short}和{2,number,#.#};都属于FormatElement,0,1,2是ArgumentIndex。

2、{1,number,short}里面的number属于FormatType,short则属于FormatStyle

3、{1,number,#.#}里面的#.#就属于子格式模式。

指定FormatTypeFormatStyle是为了生成日期格式的值、不同精度的数字、百分比类型等等。

实例:

1、ArgumentIndex必须是非负整数,它的个数不只限于0到9这10个,它可以用0到9的数字组成,因此可以有好多个,如:

  1. String pig = "{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}{13}{14}{15}{16}";
  2. Object[] array = new Object[]{"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q"};
  3. String value = MessageFormat.format(message, array);
  4. System.out.println(value);

最终结果是:ABCDEFGHIJKLMNOPQ

2、格式化字符串时,两个单引号才表示一个单引号,单个单引号会被省略,如:

  1. String message = "oh, {0} is 'a' pig";
  2. Object[] array = new Object[]{"ZhangSan"};
  3. String value = MessageFormat.format(message, array);
  4. System.out.println(value);

最终结果是:oh, ZhangSan is a pig

给字母a加上单引号,如:

  1. String message = "oh, {0} is ''a'' pig";
  2. Object[] array = new Object[]{"ZhangSan"};
  3. String value = MessageFormat.format(message, array);
  4. System.out.println(value);

最终结果是:oh, ZhangSan is 'a' pig

3、单引号会使某个字符或串保持原形。

所以,假如没有特殊要求,一般都是要在正式格式化之前把单引号都去掉,否则会造成不必要的麻烦,如:

  1. String message = "oh, '{0}' is a pig";
  2. Object[] array = new Object[]{"ZhangSan"};
  3. String value = MessageFormat.format(message, array);
  4. System.out.println(value);

最终结果是:oh, {0} is 'a' pig,此处ZhangSan无法显示。

又如,使用子格式模式,多了一个单引号:

  1. String message = "oh, '{0,number,#.#} is a pig";
  2. Object[] array = new Object[]{new Double(3.1415)};
  3. String value = MessageFormat.format(message, array);
  4. System.out.println(value);

最终结果是:oh, {0,number,#.#}  is 'a' pig。

如果像下面这样,就可以正确显示:

  1. String message = "oh, {0,number,#.#} is a pig";
  2. Object[] array = new Object[]{new Double(3.1415)};
  3. String value = MessageFormat.format(message, array);
  4. System.out.println(value);

最终结果是:oh, 3.1 is a pig

3、无论是有引号字符串还是无引号字符串,左花括号都是不支持的,但支持右花括号显示,如:

  1. String message = "oh, { is a pig";
  2. Object[] array = new Object[]{"ZhangSan"};
  3. String value = MessageFormat.format(message, array);
  4. System.out.println(value);

最终结果是:异常java.lang.IllegalArgumentException: Unmatched braces in the pattern

右花括号可以显示,如:

  1. String message = "oh, } is a pig";
  2. Object[] array = new Object[]{"ZhangSan"};
  3. String value = MessageFormat.format(message, array);
  4. System.out.println(value);

最终结果是:oh, } is a pig

关于MessageFormat.format方法:

每调用一次MessageFormat.format方法,都会新创建MessageFormat的一个实例,相当于MessageFormat只使用了一次。MessageFormat类的format方法如下:

  1. public static String format(String pattern, Object ... arguments)
  2. {
  3. MessageFormat temp = new MessageFormat(pattern);
  4. return temp.format(arguments);
  5. }

如果要重复使用某个MessageFormat实例,可以用如下方式:

  1. String message = "oh, {0} is a pig";
  2. MessageFormat messageFormat = new MessageFormat(message);
  3. Object[] array = new Object[]{"ZhangSan"};
  4. String value = messageFormat.format(array);
  5. System.out.println(value);

最终结果是:oh, ZhangSan is a pig

转自:http://zqc-0101.iteye.com/blog/1140140

MessageFormat用法的更多相关文章

  1. MessageFormat用法(转载)

    MessageFormat用来格式化一个消息,通常是一个字符串,比如: String str = "I'm not a {0}, age is {1,number,short}", ...

  2. Python基础---->python的使用(二)

    学习一下python,这里对python的基础知识做一个整理.似等了一百年忽而明白,即使再见面,成熟地表演,不如不见. python的一些应用 一.类似于java中的MessageFormat用法 w ...

  3. MessFormat的简单使用

    MessageFormat用法java.text.MessageFormat 作用:MessageFormat 获取一组对象,格式化这些对象,然后将格式化后的字符串插入到模式中的适当位置. Messa ...

  4. MessageFormat.format用法

    用法一: package gacl.request.study; import java.io.IOException; import java.text.MessageFormat; import ...

  5. MessageFormat.format()用法

    1.java.text.Format的继承结构如下   2.MessageFormat模式 FormatElement { ArgumentIndex }:是从0开始的入参位置索引 { Argumen ...

  6. MessageFormat的用法,java动态替换String字符串中的占位符

    import java.text.MessageFormat; import java.util.GregorianCalendar; import java.util.Locale; public ...

  7. String.format和MessageFormat.format的对比用法

    1.MessageFormat.format import java.text.MessageFormat; /** * Created by SYJ on 2017/9/13. */ public ...

  8. java MessageFormat.format 用法

    FormatElement: { ArgumentIndex }:是从0开始的入参位置索引. { ArgumentIndex , FormatType } { ArgumentIndex , Form ...

  9. Java关于Properties用法(二)——替换配置文件中的参数

    上一章讲了配置文件的基本用法,虽然上一章已经可以解决一些需求,但还不些不足之处.假如,配置文件里面的字符串有一部分需要经常变动,另外一些不需要,上一章的方法就不方便了,所以这章主要讲如何在配置文件中使 ...

随机推荐

  1. linux永久更改eth0的ip地址

    linux中永久修改ip和子网掩码,可以用命令也可以直接到文件里修改.这里推荐直接到文件中修改.1.进入网卡配置文件 vi /etc/sysconfig/network-scripts/ifcfg-e ...

  2. 认识http协议

    http:Hyper Text Transfer Protocol,超文本传输协议.是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的是为了提供一种发布和 ...

  3. struts2 Advanced Learning

    catalog . 引言 . struts2的类型转换 . struts2的输入校验 . struts2的拦截器机制 . 使用struts2的Ajax支持 . struts2 OGNL表达式 . st ...

  4. FT232RL变砖之后

    FT232RL是个是神奇的片子,说万能可能有些夸张,但是...总之就是FTDIChip这个神奇的公司基于类似的技术,做了很多好用的产品,包括转IIC啦,转SPI啦,密码狗啦之类的.是个很有用的工具就对 ...

  5. Application.DoEvents()的使用

    最近做了一个个人数字图书馆管理系统,因为牵扯到电脑文件的扫描,想做一个实时显示当前扫面文件的功能,就类似于360文件扫描时的效果,本来打算用多线程来实现,但是方法太多没有实现,后来在程序中进行控制,由 ...

  6. StringBuilder类与String类的区别

    String对象是不可改变的,每次使用String类中的方法时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需要对字符串执行重复修改的情况下,与创建新的String对象相关的 ...

  7. C#关闭窗口代码

    if (MessageBox.Show("请您确认是否退出(Y/N)", "系统提示", MessageBoxButtons.YesNo, MessageBox ...

  8. 使用IntelliJ IDEA和Maven构建Java web项目并打包部署

    爱编程爱分享,原创文章,转载请注明出处,谢谢! http://www.cnblogs.com/fozero/p/6120375.html 一.背景 现在越来越多的人使用IntelliJ IDEA工具进 ...

  9. codevs 3143 二叉树的序遍历

    传送门 Description 求一棵二叉树的前序遍历,中序遍历和后序遍历 Input 第一行一个整数n,表示这棵树的节点个数. 接下来n行每行2个整数L和R.第i行的两个整数Li和Ri代表编号为i的 ...

  10. WPF控件ComboBox 每个Item的ToolTip引发的异常

    介绍 首先介绍下要实现的任务.做一个下拉框,当选择每个项的时候将鼠标发在上面显示该项的ToolTip的内容(Image). 实现 Model: public class SkinInfo : Noti ...