コード例 #1
0
  private StringBuffer formatInternal(
      Object arguments[],
      StringBuffer appendBuf,
      FieldPosition fp,
      FormatCharacterIterator output_iterator) {
    appendBuf.append(leader);
    if (output_iterator != null) output_iterator.append(leader);

    for (int i = 0; i < elements.length; ++i) {
      Object thisArg = null;
      boolean unavailable = false;
      if (arguments == null || elements[i].argNumber >= arguments.length) unavailable = true;
      else thisArg = arguments[elements[i].argNumber];

      AttributedCharacterIterator iterator = null;

      Format formatter = null;

      if (fp != null && i == fp.getField() && fp.getFieldAttribute() == Field.ARGUMENT)
        fp.setBeginIndex(appendBuf.length());

      if (unavailable) appendBuf.append("{" + elements[i].argNumber + "}");
      else {
        if (elements[i].setFormat != null) formatter = elements[i].setFormat;
        else if (elements[i].format != null) {
          if (elements[i].formatClass != null && !elements[i].formatClass.isInstance(thisArg))
            throw new IllegalArgumentException("Wrong format class");

          formatter = elements[i].format;
        } else if (thisArg instanceof Number) formatter = NumberFormat.getInstance(locale);
        else if (thisArg instanceof Date)
          formatter = DateFormat.getTimeInstance(DateFormat.DEFAULT, locale);
        else appendBuf.append(thisArg);
      }

      if (fp != null && fp.getField() == i && fp.getFieldAttribute() == Field.ARGUMENT)
        fp.setEndIndex(appendBuf.length());

      if (formatter != null) {
        // Special-case ChoiceFormat.
        if (formatter instanceof ChoiceFormat) {
          StringBuffer buf = new StringBuffer();
          formatter.format(thisArg, buf, fp);
          MessageFormat mf = new MessageFormat();
          mf.setLocale(locale);
          mf.applyPattern(buf.toString());
          mf.format(arguments, appendBuf, fp);
        } else {
          if (output_iterator != null) iterator = formatter.formatToCharacterIterator(thisArg);
          else formatter.format(thisArg, appendBuf, fp);
        }

        elements[i].format = formatter;
      }

      if (output_iterator != null) {
        HashMap hash_argument = new HashMap();
        int position = output_iterator.getEndIndex();

        hash_argument.put(MessageFormat.Field.ARGUMENT, new Integer(elements[i].argNumber));

        if (iterator != null) {
          output_iterator.append(iterator);
          output_iterator.addAttributes(hash_argument, position, output_iterator.getEndIndex());
        } else output_iterator.append(thisArg.toString(), hash_argument);

        output_iterator.append(elements[i].trailer);
      }

      appendBuf.append(elements[i].trailer);
    }

    return appendBuf;
  }