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
-
Method Details
-
formatTo
使用提供的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
- 要写入输出的最大字符数。精度在宽度之前应用,因此即使width
大于precision
,输出也将被截断为precision
字符。如果precision
为-1
,则字符数没有明确限制。 - 抛出:
-
IllegalFormatException
- 如果任何参数无效。有关所有可能的格式错误的规范,请参阅格式化程序类规范的详细信息部分。
-