模块 java.base
 java.util

接口 Formattable


public interface Formattable
Formattable 接口必须由任何需要使用 Formatter 's' 转换说明符执行自定义格式化的类来实现。此接口允许对格式化任意对象进行基本控制。例如,以下类根据标志和长度限制打印出股票名称的不同表示形式:
 
  import java.nio.CharBuffer;
  import java.util.Formatter;
  import java.util.Formattable;
  import java.util.Locale;
  import static java.util.FormattableFlags.*;

  ...

  public class StockName implements Formattable {
    private String symbol, companyName, frenchCompanyName;
    public StockName(String symbol, String companyName,
            String frenchCompanyName) {
      ...
    }

    ...

    public void formatTo(Formatter fmt, int f, int width, int precision) {
      StringBuilder sb = new StringBuilder();

      // decide form of name
      String name = companyName;
      if (fmt.locale().equals(Locale.FRANCE))
        name = frenchCompanyName;
      boolean alternate = (f & ALTERNATE) == ALTERNATE;
      boolean usesymbol = alternate || (precision != -1 && precision < 10);
      String out = (usesymbol ? symbol : name);

      // apply precision
      if (precision == -1 || out.length() < precision) {
        // write it all
        sb.append(out);
      } else {
        sb.append(out.substring(0, precision - 1)).append('*');
      }

      // apply width and justification
      int len = sb.length();
      if (len < width)
        for (int i = 0; i < width - len; i++)
          if ((f & LEFT_JUSTIFY) == LEFT_JUSTIFY)
            sb.append(' ');
          else
            sb.insert(0, ' ');

      fmt.format(sb.toString());
    }

    public String toString() {
      return String.format("%s - %s", symbol, companyName);
    }
  }
  

当与 Formatter 结合使用时,上述类会为各种格式字符串生成以下输出。

 
  Formatter fmt = new Formatter();
  StockName sn = new StockName("HUGE", "Huge Fruit, Inc.",
                "Fruit Titanesque, Inc.");
  fmt.format("%s", sn);          //  -> "Huge Fruit, Inc."
  fmt.format("%s", sn.toString());    //  -> "HUGE - Huge Fruit, Inc."
  fmt.format("%#s", sn);         //  -> "HUGE"
  fmt.format("%-10.8s", sn);       //  -> "HUGE   "
  fmt.format("%.12s", sn);        //  -> "Huge Fruit,*"
  fmt.format(Locale.FRANCE, "%25s", sn); //  -> "  Fruit Titanesque, Inc."
  

Formattables 对于多线程访问来说不一定是安全的。线程安全是可选的,可以由扩展和实现此接口的类强制执行。

除非另有说明,否则将 null 参数传递给此接口中的任何方法将导致抛出 NullPointerException

自从:
1.5
  • 方法总结

    修饰符和类型
    方法
    描述
    void
    formatTo(Formatter formatter, int flags, int width, int precision)
    使用提供的 formatter 格式化对象。
  • 方法详情

    • formatTo

      void formatTo(Formatter  formatter, int flags, int width, int precision)
      使用提供的 formatter 格式化对象。
      参数:
      formatter - formatter 。实现类可以调用formatter.out() formatter.locale() 分别得到这个formatter使用的Appendable Locale
      flags - 标志修改输出格式。该值被解释为位掩码。可以设置以下标志的任意组合:FormattableFlags.LEFT_JUSTIFY FormattableFlags.UPPERCASE FormattableFlags.ALTERNATE 。如果没有设置标志,将应用实现类的默认格式。
      width - 要写入输出的最小字符数。如果转换值的长度小于 width,则输出将由 '  ' 填充,直到字符总数等于宽度。默认情况下,填充位于开头。如果设置了 FormattableFlags.LEFT_JUSTIFY 标志,则填充将在末尾。如果 width-1 则没有最小值。
      precision - 要写入输出的最大字符数。精度在宽度之前应用,因此输出将被截断为 precision 个字符,即使 width 大于 precision 。如果 precision-1,则字符数没有明确限制。
      抛出:
      IllegalFormatException - 如果任何参数无效。有关所有可能的格式错误的规范,请参阅格式化程序类规范的细节部分。