`

java MessageFormat

    博客分类:
  • java
阅读更多

 

一。

MessageFormat 提供了以与语言无关方式生成连接消息的方式。使用此方法构造向终端用户显示的消息。

MessageFormat 获取一组对象,格式化这些对象,然后将格式化后的字符串插入到模式中的适当位置。

注: MessageFormat 不同于其他 Format 类,因为 MessageFormat 对象是用其构造方法之一创建的(而不是使用 getInstance MessageFormat 本身不实现特定于语言环境的行为。特定于语言环境的行为是由所提供的模式和用于已插入参数的子格式来定义的。

 

单引号的时候 如 String a = "abc'{0}'abc"; 必须改成 String a = "abc''{0}''abc";

 

 

MessageFormat运行开发者输出文本中的变量的格式。它是一个强大的类,就像下面的例子展示的那样:

String message =
  "Once upon a time ({1,date}, around about {1,time,short}), there " +
  "was a humble developer named Geppetto who slaved for " +
  "{0,number,integer} days with {2,number,percent} complete user " +
  "requirements. ";
  Object[ ] variables = new Object[ ]
  { new Integer(4), new Date( ), new Double(0.21) }
  String output = MessageFormat.format( message, variables );
  System.out.println(output); 
 

  隐藏在信息中的是描述输出的格式的一种短小的代码,范例的输出如下:
  
  Once upon a time (Nov 3, 2002, around about 1:35 AM), there was a humble developer
  named Geppetto who slaved for 4 days with 21% complete user requirements.
  假如相同的信息需要被重复输出但是变量的值不同,那么创建一个MessageFormat对象并给出信息。下面是上面的例子的修正版:
  

//String output = MessageFormat.format(message, variables );
  //变为:
  MessageFormat formatter = new MessageFormat(message);
  String output = formatter.format(variables); 
 

  
  除了可以处理日期、时间、数字和百分数外,MessageFormat也可以处理货币,运行更多的数字格式的控制并且答应指定ChoiceFormat。
  
   MessageFormat是一个极好的类,它应该经常被使用但是现在还没有。它的最大的缺点是数据是被作为变量传递而不是一个Properties对 象。一个简单的解决办法是写一个封装类,它会预解析字符串为格式化的结果,将Properties的key转换为一个数组索引,顺序是 Properties.keys( )返回的顺序。

 

二。例子

<!-- Generated by javadoc (build 1.6.0-beta2) on Fri Mar 09 12:51:16 CST 2007 -->

第一个例子 使用静态的方法 MessageFormat.format ,它在内部创建一个只使用一次的 MessageFormat

int planet = 7;
 String event = "a disturbance in the Force";

 String result = MessageFormat.format(
     "At {1,time} on {1,date}, there was {2} on planet {0,number,integer}.",
     planet, new Date(), event);
 

输出为:

 At 12:30 PM on Jul 3, 2053, there was a disturbance in the Force on planet 7.
 

下面的例子创建了一个可以重复使用的 MessageFormat 实例:

int fileCount = 1273;
 String diskName = "MyDisk";
 Object[] testArgs = {new Long(fileCount), diskName};

 MessageFormat form = new MessageFormat(
     "The disk \"{1}\" contains {0} file(s).");

 System.out.println(form.format(testArgs));
 

不同 fileCount 值的输出:

 The disk "MyDisk" contains 0 file(s).
 The disk "MyDisk" contains 1 file(s).
 The disk "MyDisk" contains 1,273 file(s).
 

对于更复杂的模式,可以使用 ChoiceFormat 来生成正确的单数和复数形式:

 MessageFormat form = new MessageFormat("The disk \"{1}\" contains {0}.");
 double[] filelimits = {0,1,2};
 String[] filepart = {"no files","one file","{0,number} files"};
 ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
 form.setFormatByArgumentIndex(0, fileform);

 int fileCount = 1273;
 String diskName = "MyDisk";
 Object[] testArgs = {new Long(fileCount), diskName};

 System.out.println(form.format(testArgs));

 

不同的 fileCount 值的输出:

 The disk "MyDisk" contains no files.
 The disk "MyDisk" contains one file.
 The disk "MyDisk" contains 1,273 files.
 

如上例所示,可以以编程方式来创建 ChoiceFormat ,或使用模式创建。有关更多信息,请参阅 ChoiceFormat

 form.applyPattern(
    "There {0,choice,0#are no files|1#is one file|1<are {0,number,integer} files}.");
 

注: 从上面的例子可以看到,由 MessageFormat 中的 ChoiceFormat 所生成的字符串要进行特殊处理;'{' 的出现用来指示子格式,并导致递归。如果 MessageFormatChoiceFormat 都是以编程方式创建的(而不是使用字符串模式),那么要注意不要生成对其自身进行递归的格式,这将导致无限循环。

当一个参数在字符串中被多次解析时,最后的匹配将是解析的最终结果。例如,

 MessageFormat mf = new MessageFormat("{0,number,#.##}, {0,number,#.#}");
 Object[] objs = {new Double(3.1415)};
 String result = mf.format( objs );
 // result now equals "3.14, 3.1"
 objs = null;
 objs = mf.parse(result, new ParsePosition(0));
 // objs now equals {new Double(3.1)}
 

同样,使用包含同一参数多个匹配项的模式对 MessageFormat 对象进行解析时将返回最后的匹配。例如,

MessageFormat mf = new MessageFormat("{0}, {0}, {0}");
 String forParsing = "x, y, z";
 Object[] objs = mf.parse(forParsing, new ParsePosition(0));
 // result now equals {new String("z")}

 

 

同步

消息格式不是同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问一个格式,则它必须是外部同步的。

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Java中的MessageFormat.format用法实例

    在Java编程中,`MessageFormat.format`方法是一个强大的工具,用于生成格式化的字符串,这些字符串可以适应不同的语言环境和数据类型。这个方法是基于`java.text.MessageFormat`类,它允许我们创建动态的、可重用的...

    Java利用MessageFormat实现短信模板的匹配

    Java利用MessageFormat实现短信模板的匹配 在Java中,实现短信模板的匹配是一项非常重要的任务,而使用MessageFormat可以方便地实现这种匹配。MessageFormat是一个强大的工具,可以格式化字符串,使得我们可以灵活...

    MessageFormat

    在Java编程语言中,`MessageFormat`类是用于格式化字符串的强大工具,它允许程序员根据指定的模式将变量数据插入到文本中。这个类是`java.text`包的一部分,主要用于国际化(i18n)和本地化(l10n)的应用场景。`...

    ActionForward和国际化

    MessageFormat mf = new MessageFormat(rb.getString("k1")); String formattedText = mf.format(new Object[]{"Tom"}); System.out.println(formattedText); ``` ### 小结 通过上述讨论,我们可以看到Struts2框架...

    前端项目-messageformat.zip

    同时,由于其遵循ICU标准,使得数据交换和维护更为方便,与后端服务(如Java的Resource Bundle或Spring的MessageSource)的集成也更为顺畅。 总的来说,MessageFormat为前端开发者提供了一套强大且灵活的解决方案,...

    JAVA发送邮件实现,消息格式化

    `MessageFormat`是Java国际化(i18n)支持的一部分,它可以将变量替换为指定的值,使得输出的消息具有可读性和一致性。例如,假设我们有一个模板字符串`"欢迎,{0}!"`,我们可以使用`MessageFormat.format()`方法将...

    java数据格式化

    `MessageFormat`类是Java中用于格式化多语言文本的强大工具,特别适用于国际化的场景。它可以动态插入变量到模板字符串中,并支持多种数据类型(如日期、时间、数字和货币)的格式化。例如: ```java String ...

    利用MessageFormat格式化字符串实例资料.pdf

    MessageFormat是Java中用于格式化字符串的一个非常有用的类,它允许我们使用模板化的模式来插入变量值,并且支持多种格式,如数字、日期、时间等。这个类的主要优点在于其灵活性和可读性,使得代码更加清晰,易于...

    Java 程序国际化教程+源码

    在编程实践中,我们还需要使用`java.text.MessageFormat`类来处理包含变量的字符串,如: ```java String pattern = "{0} says hello to {1}"; String formatted = MessageFormat.format(pattern, "Alice", "Bob");...

    Java28个相关包

    7. **java.text**:处理文本格式化和解析,如DateFormat、NumberFormat、MessageFormat等。 8. **java.concurrent**:多线程和并发编程包,包括Thread、ExecutorService、Future、Semaphore等工具类。 9. **java....

    JAVA2 SDK 类库详解

    8. **java.text**:处理文本格式化和解析,包括NumberFormat、DateFormat和MessageFormat。 9. **java.time**:自Java 8引入的新时间日期API,包括LocalDate、LocalTime、LocalDateTime和ZoneId,提供了更强大和...

    国际化 必备工具 java编写

    1. **MessageFormat**:Java内置的格式化工具,支持复杂的字符串格式化,包括日期、数字和消息的国际化。 2. **I18N Lib**:开源库,提供了更方便的API来处理国际化,包括动态加载资源、自动处理编码转换等。 3. **...

    Java API 1.6中文版

    10. **java.text**:处理文本格式化,如`NumberFormat`、`DateFormat`和`MessageFormat`,用于国际化和本地化。 在Java 1.6版本中,引入了增强的for循环(foreach loop),改进了泛型,添加了并发工具类如`...

    Java各种工具类

    5. **java.text**: 这个包包含处理文本、日期、数字和消息的类,如NumberFormat用于格式化数字,DateFormat用于日期和时间的格式化,MessageFormat用于构造和解析消息。 6. **java.time**: Java 8引入的新时间日期...

    java api 1.6 中文手册.rar

    9. **国际化**:`java.util.Locale`和`java.text.MessageFormat`支持多语言环境,使应用能适应不同地区的文化习惯。 10. **XML处理**:`javax.xml`包提供了处理XML文档的API,如`DOM`和`SAX`解析器,以及`...

    Java期末复习-常用类库

    Java 期末复习涉及众多常用的类库,这些类库在日常编程中扮演着重要角色。首先,我们关注StringBuffer类,这是处理字符串时的一个关键选择,特别是在字符串需要频繁修改的情况下。StringBuffer提供了append方法来...

    java6.0 API 英文版

    在国际化和本地化方面,`java.text`包下的`MessageFormat`和`ChoiceFormat`类得到改进,更便于处理多语言环境下的文本格式和选择表达。 Java 6.0还引入了新的脚本引擎API(JSR 223),允许Java程序内嵌入并执行各种...

Global site tag (gtag.js) - Google Analytics