返回介绍

java.util 接口 Formattable

发布于 2019-10-04 09:51:29 字数 4529 浏览 968 评论 0 收藏 0


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." 

可格式化项对于多线程访问而言没必要是安全的。线程安全是可选的,并且可以通过扩展和实现此接口的类来强制执行。

除非另行指定,否则将 null 参数传递给此接口中的任何方法都会抛出 NullPointerException

从以下版本开始:
1.5

方法摘要
voidformatTo(Formatterformatter, intflags, intwidth, intprecision)

使用提供的 格式化程序 来格式化对象。

方法详细信息

formatTo

void formatTo(Formatterformatter,
              intflags,
              intwidth,
              intprecision)
使用提供的 格式化程序 来格式化对象。
参数:
formatter - 格式化程序 。实现类可以调用 formatter.out()formatter.locale() ,以获得分别由此 formatter 使用的 AppendableLocale
flags - 这些标志将修改输出格式。该值被解释为位掩码。可以将以下标志的组合设置为: FormattableFlags.LEFT_JUSTIFYFormattableFlags.UPPERCASEFormattableFlags.ALTERNATE 。如果没有设置标志,则应用实现类的默认格式。
width - 写入到输出的最少字符数。如果转换值的长度小于 width ,那么输出将用 '' 来填充,直到总字符数等于 width。默认情况下,从开始处进行填充。如果设置了 FormattableFlags.LEFT_JUSTIFY 标志,则从结尾处进行填充。如果 width-1 ,则不存在最少字符数。
precision - 写入到输出的最多字符数。precision 应用在 width 之前,因此,即使 width 大于 precision ,输出也将被截断为 precision 字符。如果 precision-1 ,那么对于字符的数量没有明显限制。
抛出:
IllegalFormatException - 如果所有参数都无效。有关所有可能的格式设置错误的规范,请参阅 formatter 类规范的 Details 一节。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文