MessageFormat.format()用法


1.java.text.Format的繼承結構如下

 

2.MessageFormat模式

FormatElement

{ ArgumentIndex }:是從0開始的入參位置索引

{ ArgumentIndex , FormatType }

{ ArgumentIndex , FormatType , FormatStyle }

 FormatType:指定使用不同的Format子類對入參進行格式化處理。值范圍如下:

number:調用NumberFormat進行格式化

date:調用DateFormat進行格式化

time:調用DateFormat進行格式化

choice:調用ChoiceFormat進行格式化

FormatStyle:設置FormatType中使用的格式化樣式。值范圍如下:

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,#.#}里面的#.#就屬於子格式模式。

指定FormatType和FormatStyle是為了生成日期格式的值、不同精度的數字、百分比類型等等。

3.用法

1、ArgumentIndex必須是非負整數,它的個數不只限於0到9這10個,它可以用0到9的數字組成,因此可以有好多個,如:
  1.  
    String msg =  "{0}{1}{2}{3}{4}{5}{6}{7}{8}";  
  2.  
    Object [] array =  new Object[]{"A","B","C","D","E","F","G","H","I",};         
  3.  
    String value = MessageFormat.format(msg, array);  
  4.  
    System.out.println(value);   // 輸出:ABCDEFGHI
2、格式化字符串時,兩個單引號才表示一個單引號,單個單引號會被省略,除非中文單引號不會被省略,如:
  1.  
    String value = MessageFormat.format( "oh, {0} is 'a' pig", "ZhangSan");
  2.  
    System.out.println(value); // 輸出:oh, ZhangSan is a pig
給字母a加上單引號,如:
  1.  
    String value = MessageFormat.format( "oh, {0} is 'a' pig", "ZhangSan"); 
  2.  
    System.out.println(value);   // 輸出:oh, ZhangSan is a pig
如果需要顯示雙引號要進行轉移,比如:String msg = "oh, {0} is \"a\" pig";

3、單引號會使其后面的占位符均失效,導致直接輸出占位符。

 

  1.  
    MessageFormat.format( "{0}{1}", 1, 2); // 結果12
  2.  
    MessageFormat.format( "'{0}{1}", 1, 2); // 結果{0}{1}
  3.  
    MessageFormat.format( "'{0}'-{1}", 1, 2); // 結果{0}-2
使用雙引號和兩個單引號沒有關系,比如

 

 

  1.  
    String value = MessageFormat.format( "oh, ''{0}'' is a pig", "ZhangSan");  
  2.  
    System.out.println(value);   // 輸出:oh, 'ZhangSan' is a pig
又比如,使用子格式模式,多了一個單引號:

 

 

  1.  
    String value = MessageFormat.format( "oh, {0,number,#.#} is good num", Double.valueOf("3.1415"));  
  2.  
    System.out.println(value);   // 輸出:oh, 3.1 is good num

 

3、無論是有引號字符串還是無引號字符串,左花括號都是不支持的,如:

 

  1.  
    String value = MessageFormat.format( "oh, } is good num", Double.valueOf("3.1415"));    
  2.  
    System.out.println(value);   // 輸出:oh, } is good num
如果使用左花括號會出現異常

 

 

  1.  
    String value = MessageFormat.format( "oh, { is good num", Double.valueOf("3.1415"));  
  2.  
    System.out.println(value);   // java.lang.IllegalArgumentException: Unmatched braces in the pattern.
因此要使用到左花括號需要使用單引號配合使用

 

 

MessageFormat.format("'{'{0}}", "X-rapido"); // {X-rapido}
還有一個有趣的現象,如果出現兩個或2個以上左花括號,就會出現分割字符串,但是右花括號就沒問題,雖然沒有任何意義,實際應用我們也用不到

 

 

  1.  
    String value = MessageFormat.format( "oh, {{ is good num", "d");  
  2.  
    System.out.println(value);   // oh,   
  3.  
     
  4.  
    String value = MessageFormat.format( "oh, }} is good num", "d");    
  5.  
    System.out.println(value);   // oh, }} is good num

 

關於MessageFormat.format方法:

 

 

每調用一次MessageFormat.format方法,都會新創建MessageFormat的一個實例,相當於MessageFormat只使用了一次。MessageFormat類的format方法如下:

 

  1.  
    public static String format(String pattern, Object ... arguments){    
  2.  
        MessageFormat temp =  new MessageFormat(pattern);    
  3.  
         return temp.format(arguments);    
  4.  
    }
因此若要多次格式同一個模式的字符串,那么創建一個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.  
          
    6.  
      System.out.println(value);
    7.  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM