2017-06-09 256 views
0

如果有錯誤,我找不到我的錯誤。MessageFormat無法正常工作

我給21作爲參數傳遞給MessageFormat但它返回11

我無法解決這個問題。我也找不到任何已知的問題。

有沒有機會解決這個問題?

我的代碼喜歡以下。在TextHelper類中發生錯誤。

Intl類:

public class Intl { 

    private static final String FILENAME = "MessageBundle"; 
    public static ResourceBundle MessageBundle; 

    static { 
    try { 
     MessageBundle = ResourceBundle.getBundle(FILENAME); // Uses the default Locale of the phone 
    } catch (NullPointerException | MissingResourceException e) { 
     Locale defaultLocale = new Locale("en", "US"); 
     MessageBundle = ResourceBundle.getBundle(FILENAME, defaultLocale); // Uses the default Locale if an exception occurred 
    } 
    } 

} 


MessageBundle_en_US.properties文件:

######################################################################## 
# HOW TO GENERATE A singleNotifSummary 
######################################################################## 
# String singlePen Intl.MessageBundle.getString("singlePen"); 
# MessageFormat form = new MessageFormat("singleNotifSummary"); 
# double[] limits = {1,2}; 
# String multiPens Intl.MessageBundle.getString("multipen"); 
# String[] part = {"{0,number}" + singlePen, "{0,number}" + multiPen}; 
# ChoiceFormat format = new ChoiceFormat(limits, part); 
# form.setFormatByArgumentIndex(0, format); 
# Object[] args = {1}; 
# String result = form.format(args); 
# Ex 1: Total 1 pen // when args = {1} 
# Ex 2: Total 12 pens // when args = {12} 
######################################################################## 

singlePen=pen 
singleBook=book 
multiPen=pens 
multiBook=books 
# singleNotifSummary specifies only one type of materials 
singleNotifSummary=Total {0} 
# doubleNotifSummary specifies both of materials book and pen 
# Ex 1: Total 27 books and 1 pen 
doubleNotifSummary=Total {0} and {1} 


TextHelper

public class TextHelper { 
    ... 
    private int mTotalBooks = 0; 
    private int mTotalPens = 0; 
    ... 
    ... 


    /****** Variables that are used when generating Summary Text ******/ 
    final double[] limits = {1,2}; // 1 means single and 2 means multi 
    final String singleNotifSummary = Intl.MessageBundle.getString("singleNotifSummary"); // "New {0}" 
    final String doubleNotifSummary = Intl.MessageBundle.getString("doubleNotifSummary"); // "New {0} and {1}" 
    final MessageFormat singleForm = new MessageFormat(singleNotifSummary); 
    final MessageFormat doubleForm = new MessageFormat(doubleNotifSummary); 
    final String singleBook = Intl.MessageBundle.getString("singleBook"); // "Book" 
    final String multiBook = Intl.MessageBundle.getString("multiBook"); // "Books" 
    final String singlePen = Intl.MessageBundle.getString("singlePen"); // "Pen" 
    final String multiPen = Intl.MessageBundle.getString("multiPen"); // "Pens" 
    final String[] bookPart = {"{0,number,integer} " + singleBook, "{0,number,integer} " + multiBook}; 
    final String[] penPart = {"{0,number,integer} " + singlePen, "{0,number,integer} " + multiPen}; 
    final ChoiceFormat bookFormat = new ChoiceFormat(limits, bookPart); 
    final ChoiceFormat penFormat = new ChoiceFormat(limits, penPart); 

    /**********************************************************************/ 

    ... 


    public String generateSummaryText() { 
     String summaryText = ""; 

     if (mTotalBooks == 0 && mTotalPens > 0) { 

      // In this case there is only Book(s) (single-type) 
      singleForm.setFormatByArgumentIndex(0, penFormat); // applying the format to argument "{0}" 
      Object[] args = { mTotalPens }; // total Pens count 
      summaryText = singleForm.format(args); 

     } else if (mTotalBooks > 0 && mTotalPens == 0) { 

      // In this case there is only Pen(s) (single-type) 
      singleForm.setFormatByArgumentIndex(0, offerFormat); // applying the format to argument "{0}" 
      Object[] args = { mTotalBooks }; // total Books count 
      summaryText = singleForm.format(args); 

     } else { 

      // In this case there are Book(s) and Pen(s) (double-type) 
      doubleForm.setFormatByArgumentIndex(0, bookFormat); // applying the format to argument "{0}" 
      doubleForm.setFormatByArgumentIndex(1, penFormat); // applying the format to argument "{1}" 
      Log.v(TAG, TAG2 + " --> mTotalBooks: " + mTotalBooks); // writes 2 
      Log.v(TAG, TAG2 + " --> mTotalPens: " + mTotalPens); // writes 1 
      // Object[] args = { new Integer(mTotalPens), new Integer(mTotalPens) }; 
      Object[] args = { mTotalPens, mTotalPens }; 
      summaryText = doubleForm.format(args); 
      Log.v(TAG, TAG2 + " --> summaryText: " + summaryText); // writes "Total 1 book and 1 pen" 
      Log.v(TAG, TAG2 + " --> mTotalBooks: " + mTotalBooks); // writes 2 
      Log.v(TAG, TAG2 + " --> mTotalPens: " + mTotalPens); // writes 1 

     } 

     return summaryText; 
    } 


} 

回答

1

問題是噸您在bookPartpenPart中均指0。因此,當您將{1, 2}傳遞給格式化程序時,它會根據您設置的限制正確計算單個/複數,但僅打印第0個參數,即1。在整個格式模式中,您必須將參數指定爲{1}

正確的代碼將是:在https://docs.oracle.com/javase/7/docs/api/java/text/ChoiceFormat.html

final String[] bookPart = {"{0,number,integer} " + singleBook, "{0,number,integer} " + multiBook}; 
final String[] penPart = {"{1,number,integer} " + singlePen, "{1,number,integer} " + multiPen}; 

看第二示例中,線#2。

+0

是的!你完全正確!它應該是這樣的!非常感謝你!我忽略了它! – efkan

+0

你節省了我的時間,你讓我的一天!再次感謝。複製粘貼後,我忘了改變它。 – efkan