使用MessageFormat格式化数字,日期

 

http://www.cppblog.com/biao/archive/2010/12/01/135119.html

如数字上加逗号,保留小数点后面两位(会自动四舍五入),百分比,货币等。

参考实例: http://www.java2s.com/Code/Java/Development-Class/MessageFormat.htm

import java.text.MessageFormat;


public class Test {

    public static void main(String[] args) {

        Object[] params = { new Integer(123), new Double(1222234.567) };

        String msg = MessageFormat.format("{0,number,percent} and {1,number,,###.##}", params);

        System.out.println(msg);

    }

}

=========

http://sunxboy.iteye.com/blog/273950

第一个例子使用静态的方法 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.

 

 

=============================================================

 

Java代码 复制代码 收藏代码
  1. MessageFormat 使用以下形式的模式:   
  2.   
  3. MessageFormatPattern:   
  4. String   
  5. MessageFormatPattern FormatElement String   
  6.   
  7. FormatElement:   
  8. { ArgumentIndex }   
  9. { ArgumentIndex , FormatType }   
  10. { ArgumentIndex , FormatType , FormatStyle }   
  11.   
  12. FormatType: one of   
  13. number date time choice   
  14.   
  15. FormatStyle:   
  16. short  
  17. medium   
  18. long  
  19. full   
  20. integer   
  21. currency   
  22. percent   
  23. SubformatPattern   
  24.   
  25. String:   
  26. StringPartopt   
  27. String StringPart   
  28.   
  29. StringPart:   
  30. ''  
  31. ' QuotedString '  
  32. UnquotedString   
  33.   
  34. SubformatPattern:   
  35. SubformatPatternPartopt   
  36. SubformatPattern SubformatPatternPart   
  37.   
  38. SubFormatPatternPart:   
  39. ' QuotedPattern '  
  40. UnquotedPattern  
MessageFormat 使用以下形式的模式:

MessageFormatPattern:
String
MessageFormatPattern FormatElement String

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

FormatType: one of
number date time choice

FormatStyle:
short
medium
long
full
integer
currency
percent
SubformatPattern

String:
StringPartopt
String StringPart

StringPart:
''
' QuotedString '
UnquotedString

SubformatPattern:
SubformatPatternPartopt
SubformatPattern SubformatPatternPart

SubFormatPatternPart:
' QuotedPattern '
UnquotedPattern

 

在 String 中,"''" 表示单引号。QuotedString 可以包含除单引号之外的任意字符;围绕的单引号被移除。UnquotedString 可以包含除单引号和左花括号之外的任意字符。因此,格式化后消息字符串为 "'{0}'" 的字符串可以写作 "'''{'0}''" 或 "'''{0}'''"。

在 SubformatPattern 中,应用了不同的规则。QuotedPattern 可包含除单引号之外的任意字符,但不移除围绕的单引号,因此它们可以由子格式解释。例如,"{1,number,$'#',##}" 将产生一个带井号的数字格式,结果如:"$#31,45"。 UnquotedPattern 可以包含除单引号之外的任意字符,但其中的花括号必须成对出现。例如,"ab {0} de" 和 "ab '}' de" 是有效的子格式模式,而 "ab {0'}' de" 和 "ab } de" 则是无效的。

http://terryjs.iteye.com/blog/768872

==================

一。

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

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

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

 

 

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

Java代码
String message =   
  1.   "Once upon a time ({1,date}, around about {1,time,short}), there " +   
  2.   "was a humble developer named Geppetto who slaved for " +   
  3.   "{0,number,integer} days with {2,number,percent} complete user " +   
  4.   "requirements. ";   
  5.   Object[ ] variables = new Object[ ]   
  6.   { new Integer(4), new Date( ), new Double(0.21) }   
  7.   String output = MessageFormat.format( message, variables );   
  8.   System.out.println(output);   
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对象并给出信息。下面是上面的例子的修正版:
  

Java代码
//String output = MessageFormat.format(message, variables );   
  1.   //变为:   
  2.   MessageFormat formatter = new MessageFormat(message);   
  3.   String output = formatter.format(variables);   
//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

Java代码
int planet = 7;   
  1.  String event = "a disturbance in the Force";   
  2.   
  3.  String result = MessageFormat.format(   
  4.      "At {1,time} on {1,date}, there was {2} on planet {0,number,integer}.",   
  5.      planet, new Date(), event);  
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 实例:

Java代码
int fileCount = 1273;   
  1.  String diskName = "MyDisk";   
  2.  Object[] testArgs = {new Long(fileCount), diskName};   
  3.   
  4.  MessageFormat form = new MessageFormat(   
  5.      "The disk \"{1}\" contains {0} file(s).");   
  6.   
  7.  System.out.println(form.format(testArgs));  
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 来生成正确的单数和复数形式:

Java代码
MessageFormat form = new MessageFormat("The disk \"{1}\" contains {0}.");   
  1. double[] filelimits = {0,1,2};   
  2. String[] filepart = {"no files","one file","{0,number} files"};   
  3. ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);   
  4. form.setFormatByArgumentIndex(0, fileform);   
  5.   
  6. int fileCount = 1273;   
  7. String diskName = "MyDisk";   
  8. Object[] testArgs = {new Long(fileCount), diskName};   
  9.   
  10. System.out.println(form.format(testArgs));  
 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

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

 

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

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

Java代码
MessageFormat mf = new MessageFormat("{0,number,#.##}, {0,number,#.#}");   
  1. Object[] objs = {new Double(3.1415)};   
  2. String result = mf.format( objs );   
  3. // result now equals "3.14, 3.1"   
  4. objs = null;   
  5. objs = mf.parse(result, new ParsePosition(0));   
  6. // objs now equals {new Double(3.1)}  
 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 对象进行解析时将返回最后的匹配。例如,

Java代码  MessageFormat mf = new MessageFormat("{0}, {0}, {0}");   
  1.  String forParsing = "x, y, z";   
  2.  Object[] objs = mf.parse(forParsing, new ParsePosition(0));   
  3.  // result now equals {new String("z")}  
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")}

 

 

同步

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

 

展开阅读全文

没有更多推荐了,返回首页