モジュール java.base
パッケージ java.util

インタフェースFormattable



  • public interface Formattable
    Formattableインタフェースを実装する必要があるのは、Formatters変換指示子を使用してカスタムの書式設定を行う必要のあるクラスです。 このインタフェースは、任意のオブジェクトを書式設定するための基本コントロールとして使用できます。 たとえば、次のクラスは、フラグと長さの制約に応じて、ストック名の異なる表現を出力します:
     
       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
    • メソッドの詳細

      • formatTo

        void formatTo​(Formatter formatter,
                      int flags,
                      int width,
                      int precision)
        指定されたformatterを使用してオブジェクトの書式設定を行います。
        パラメータ:
        formatter - formatter クラスの実装によりformatter.out()またはformatter.locale()が呼び出され、このformatterで使用されるAppendableまたはLocaleがそれぞれ取得される。
        flags - フラグにより出力書式が変更される。 値はビット・マスクとして解釈される。 フラグFormattableFlags.LEFT_JUSTIFYFormattableFlags.UPPERCASE、およびFormattableFlags.ALTERNATEを任意に組み合わせて設定できる。 フラグが設定されていない場合、実装するクラスのデフォルト書式が適用される。
        width - 出力に書き込まれる最小文字数。 変換後の値の長さがwidthより小さい場合、総文字数がwidthに等しくなるまで出力に'  'がパディングされる。 デフォルトでは、パディングは先頭に対して行われる。 FormattableFlags.LEFT_JUSTIFYフラグが設定された場合、パディングは終端に対して行われる。 width-1の場合、最小値は存在しない。
        precision - 出力に書き込まれる最大文字数。 precisionはwidthの前に適用されるため、widthの値がprecisionより大きい場合でも、出力はprecisionで指定された文字数に切り詰められる。 precision-1の場合、文字数に明示的な制限は存在しない。
        例外:
        IllegalFormatException - いずれのパラメータも不正な場合。 考えられるすべての書式エラーの仕様については、フォーマッタ・クラス仕様の「詳細」セクションを参照。