Интерфейс Formattable
public interface Formattable
Formattable должен быть реализован любым классом, которому необходимо выполнить пользовательскую форматирование с использованием спецификатора преобразования 's' класса Formatter. Этот интерфейс позволяет осуществлять базовый контроль форматирования произвольных объектов. Например, следующий класс выводит разные представления имени акции в зависимости от флагов и ограничений длины:
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
Краткое описание методов
Подробное описание методов
formatTo
void formatTo(Formatter formatter, int flags, int width, int precision)
formatter.- Параметры:
-
formatter-formatter. Реализующие классы могут вызватьformatter.out()илиformatter.locale(), чтобы получитьAppendableилиLocale, используемые этимformatterсоответственно. -
flags- Флаги изменяют формат вывода. Значение интерпретируется как битовая маска. Любая комбинация следующих флагов может быть установлена:FormattableFlags.LEFT_JUSTIFY,FormattableFlags.UPPERCASEиFormattableFlags.ALTERNATE. Если флаги не установлены, применяется стандартное форматирование реализующего класса. -
width- Минимальное количество символов, подлежащих записи в выходной поток. Если длина преобразованного значения меньшеwidth, то вывод будет заполнен' 'до тех пор, пока общее количество символов не будет равно ширине. По умолчанию заполнение выполняется в начале. Если установлен флагFormattableFlags.LEFT_JUSTIFY, то заполнение будет выполняться в конце. Еслиwidthравно-1, то минимальной длины нет. -
precision- Максимальное количество символов, подлежащих записи в выходной поток. Точность применяется до ширины, поэтому вывод будет усечен доprecisionсимволов, даже еслиwidthбольшеprecision. Еслиprecisionравно-1, то нет явного ограничения на количество символов. - Исключения:
-
IllegalFormatException- Если какой-либо из параметров недопустим. Для спецификации всех возможных ошибок форматирования см. раздел «Подробности» спецификации класса форматировщика.
© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Formattable.html