Module java.base
Package java.util

Interface Formattable


public interface Formattable
Formattable接口必须由任何需要使用'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."
 

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

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

自从:
1.5
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    formatTo(Formatter formatter, int flags, int width, int precision)
    使用提供的formatter格式化对象。
  • Method Details

    • formatTo

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