首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MessageFormat不像预期的那样工作

MessageFormat不像预期的那样工作
EN

Stack Overflow用户
提问于 2017-06-09 18:26:24
回答 1查看 1.6K关注 0票数 0

如果有,我找不到我的错误。

我给出了2 1 作为 MessageFormat 的参数,但是它返回 1 E 221 1**.**

我不能解决这个问题。此外,我也找不到任何已知的问题。

是否有机会克服这个问题?

我的代码如下所示。错误发生在TextHelper类中。

Intl类:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
########################################################################
# 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

代码语言:javascript
复制
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;
    }


}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-09 19:56:04

问题是,您在bookPartpenPart中都是指penPart。因此,当您将{1, 2}传递给格式化程序时,它根据设置的限制正确地计算单个/复数,但只打印第0参数,即1。在整个格式化模式中,必须将pens参数作为{1}引用。

正确的代码是:

代码语言:javascript
复制
final String[] bookPart = {"{0,number,integer} " + singleBook, "{0,number,integer} " + multiBook};
final String[] penPart = {"{1,number,integer} " + singlePen, "{1,number,integer} " + multiPen};

看看第二个例子,https://docs.oracle.com/javase/7/docs/api/java/text/ChoiceFormat.html的第2行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44464534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档