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."
マルチスレッド・アクセスを実行する場合、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_JUSTIFY
、FormattableFlags.UPPERCASE
、およびFormattableFlags.ALTERNATE
を任意に組み合わせて設定できる。 フラグが設定されていない場合、実装するクラスのデフォルト書式が適用される。width
- 出力に書き込まれる最小文字数。 変換後の値の長さがwidth
より小さい場合、総文字数がwidthに等しくなるまで出力に' '
がパディングされる。 デフォルトでは、パディングは先頭に対して行われる。FormattableFlags.LEFT_JUSTIFY
フラグが設定された場合、パディングは終端に対して行われる。width
が-1
の場合、最小値は存在しない。precision
- 出力に書き込まれる最大文字数。 precisionはwidthの前に適用されるため、width
の値がprecision
より大きい場合でも、出力はprecision
で指定された文字数に切り詰められる。precision
が-1
の場合、文字数に明示的な制限は存在しない。- 例外:
IllegalFormatException
- いずれのパラメータも不正な場合。 考えられるすべての書式エラーの仕様については、フォーマッタ・クラス仕様の「詳細」セクションを参照。
-