2017-06-09 4 views
0

私の間違いがある場合は見つけられません。MessageFormatが正常に動作しません

私はMessageFormatに引数として21を与えるが、それは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

問題をtあなたは0bookPartpenPartの両方で表しています。したがって、{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

関連する問題