Класс MessageFormat
- Все реализованные интерфейсы:
-
Serializable,Cloneable
public class MessageFormat extends Format
MessageFormat предоставляет средство для создания конкатенированных сообщений нейтральным для языка способом. Используйте это для построения сообщений, отображаемых для конечных пользователей. MessageFormat принимает набор объектов, форматирует их, а затем вставляет отформатированные строки в шаблон в соответствующих местах.
Примечание: MessageFormat отличается от других классов Format тем, что вы создаете объект MessageFormat с помощью одного из его конструкторов (а не с помощью метода фабрики в стиле getInstance). Методы фабрики не нужны, потому что MessageFormat сам по себе не реализует специфичное для локали поведение. Любое специфичное для локали поведение определяется шаблоном, который вы предоставляете, а также подформатами, используемыми для вставленных аргументов.
Шаблоны и их интерпретация
MessageFormat использует шаблоны следующего вида:
MessageFormatPattern:
String
MessageFormatPattern FormatElement String
FormatElement:
{ ArgumentIndex }
{ ArgumentIndex , FormatType }
{ ArgumentIndex , FormatType , FormatStyle }
FormatType: one of
number date time choice
FormatStyle:
short
medium
long
full
integer
currency
percent
SubformatPattern
Внутри строки пара одинарных кавычек может использоваться для цитирования любых произвольных символов, кроме одинарных кавычек. Например, строка шаблона "'{0}'" представляет строку "{0}", а не FormatElement. Сама одинарная кавычка должна быть представлена удвоенными одинарными кавычками '' во всей строке. Например, строка шаблона "'{''}'" интерпретируется как последовательность '{ (начало цитирования и левая фигурная скобка), '' (одинарная кавычка) и }' (правая фигурная скобка и конец цитирования), а не '{' и '}' (зацитированные левая и правая фигурные скобки): представляющая строку "{'}", а не "{}".
SubformatPattern интерпретируется соответствующим подформатом, и применяются правила шаблонов, зависящие от подформата. Например, строка шаблона "{1,number,$'#',##}" (SubformatPattern с подчеркиванием) создаст числовой формат с зацитированным знаком решетки, с результатом, например:
"$#31,45". Обратитесь к документации каждого подкласса Format для получения подробной информации.
Любая незакрытая кавычка рассматривается как закрытая в конце данного шаблона. Например, строка шаблона "'{0}" рассматривается как шаблон "'{0}'".
Любые фигурные скобки в незацитированном шаблоне должны быть сбалансированы. Например, "ab {0} de" и "ab '}' de" являются допустимыми шаблонами, но "ab {0'}' de", "ab } de" и "''{''" - нет.
- Предупреждение:
- Правила использования кавычек в шаблонах форматов сообщений, к сожалению, оказались несколько запутанными. В частности, локализаторам не всегда очевидно, нужно ли удваивать одинарные кавычки или нет. Убедитесь, что вы информируете локализаторов о правилах и сообщите им (например, используя комментарии в исходных файлах пакетов ресурсов), какие строки будут обрабатываться
MessageFormat. Обратите внимание, что локализаторам может потребоваться использовать одинарные кавычки в переведенных строках, где в исходной версии их нет.
Значение ArgumentIndex - это неотрицательное целое число, записанное с помощью цифр '0' по '9', и представляет индекс в массиве arguments, передаваемом в методы format или результирующий массив, возвращаемый методами parse.
Значения FormatType и FormatStyle используются для создания экземпляра Format для элемента форматирования. В следующей таблице показано, как значения сопоставляются с экземплярами Format. Комбинации, не показанные в таблице, являются недопустимыми. SubformatPattern должен быть допустимой строкой шаблона для используемого подкласса Format.
Информация об использовании
Вот несколько примеров использования. В реальных интернационализированных программах шаблон формата сообщения и другие статические строки, конечно же, будут получаться из пакетов ресурсов. Другие параметры будут динамически определяться во время выполнения.
В первом примере используется статический метод MessageFormat.format, который внутренне создает MessageFormat для одноразового использования:
int planet = 7;
String event = "a disturbance in the Force";
String result = MessageFormat.format(
"At {1,time} on {1,date}, there was {2} on planet {0,number,integer}.",
planet, new Date(), event);
Результат: At 12:30 PM on Jul 3, 2053, there was a disturbance in the Force on planet 7.
В следующем примере создается экземпляр MessageFormat, который можно использовать многократно:
int fileCount = 1273;
String diskName = "MyDisk";
Object[] testArgs = {new Long(fileCount), diskName};
MessageFormat form = new MessageFormat(
"The disk \"{1}\" contains {0} file(s).");
System.out.println(form.format(testArgs));
Результат с разными значениями для fileCount: The disk "MyDisk" contains 0 file(s). The disk "MyDisk" contains 1 file(s). The disk "MyDisk" contains 1,273 file(s).
Для более сложных шаблонов можно использовать ChoiceFormat для создания правильных форм для единственного и множественного числа:
MessageFormat form = new MessageFormat("The disk \"{1}\" contains {0}.");
double[] filelimits = {0,1,2};
String[] filepart = {"no files","one file","{0,number} files"};
ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
form.setFormatByArgumentIndex(0, fileform);
int fileCount = 1273;
String diskName = "MyDisk";
Object[] testArgs = {new Long(fileCount), diskName};
System.out.println(form.format(testArgs));
Результат с разными значениями для fileCount: The disk "MyDisk" contains no files. The disk "MyDisk" contains one file. The disk "MyDisk" contains 1,273 files.
Вы можете создать ChoiceFormat программным способом, как в приведенном выше примере, или с помощью шаблона. См. ChoiceFormat для получения дополнительной информации.
form.applyPattern( "There {0,choice,0#are no files|1#is one file|1<are {0,number,integer} files}.");
Примечание: Как мы видим выше, строка, созданная ChoiceFormat в MessageFormat, рассматривается как специальная; вхождения '{' используются для обозначения подформатов и вызывают рекурсию. Если вы создаете и MessageFormat, и ChoiceFormat программным способом (вместо использования строковых шаблонов), то будьте осторожны, чтобы не создать формат, который рекурсивно вызывает сам себя, что приведет к бесконечному циклу.
Когда один аргумент анализируется более одного раза в строке, последнее совпадение будет окончательным результатом анализа. Например,
MessageFormat mf = new MessageFormat("{0,number,#.##}, {0,number,#.#}");
Object[] objs = {new Double(3.1415)};
String result = mf.format( objs );
// result now equals "3.14, 3.1"
objs = null;
objs = mf.parse(result, new ParsePosition(0));
// objs now equals {new Double(3.1)}
Аналогично, парсинг с помощью объекта MessageFormat с использованием шаблонов, содержащих несколько вхождений одного и того же аргумента, вернёт последнюю совпадение. Например,
MessageFormat mf = new MessageFormat("{0}, {0}, {0}");
String forParsing = "x, y, z";
Object[] objs = mf.parse(forParsing, new ParsePosition(0));
// result now equals {new String("z")}
Синхронизация
Форматы сообщений не синхронизированы. Рекомендуется создавать отдельные экземпляры формата для каждого потока. Если несколько потоков одновременно обращаются к формату, необходимо обеспечить внешнюю синхронизацию.
- Since:
- 1.1
- See Also:
Краткое описание вложенных классов
| Modifier and Type | Class | Description |
|---|---|---|
static class |
MessageFormat.Field |
Определяет константы, используемые в качестве ключей атрибутов в AttributedCharacterIterator , возвращаемом из MessageFormat.formatToCharacterIterator. |
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
MessageFormat |
Создаёт MessageFormat для локали по умолчанию FORMAT и указанного шаблона. |
MessageFormat |
Создаёт MessageFormat для указанной локали и шаблона. |
Краткое описание методов
| Modifier and Type | Метод | Описание |
|---|---|---|
void |
applyPattern |
Устанавливает шаблон, используемый этим форматом сообщений. |
Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Сравнение на равенство двух объектов формата сообщений |
final StringBuffer |
format |
Форматирует массив объектов и добавляет шаблон MessageFormat, с элементами формата, заменёнными отформатированными объектами, в предоставленный StringBuffer. |
final StringBuffer |
format |
Форматирует массив объектов и добавляет шаблон MessageFormat, с элементами формата, заменёнными отформатированными объектами, в предоставленный StringBuffer. |
static String |
format |
Создаёт MessageFormat с заданным шаблоном и использует его для форматирования заданных аргументов. |
AttributedCharacterIterator |
formatToCharacterIterator |
Форматирует массив объектов и вставляет их в шаблон MessageFormat, создавая AttributedCharacterIterator. |
Format[] |
getFormats() |
Получает форматы, используемые для элементов формата в ранее заданной строке шаблона. |
Format[] |
getFormatsByArgumentIndex() |
Получает форматы, используемые для значений, переданных в методы format или возвращаемых методами parse. |
Locale |
getLocale() |
Получает локаль, используемую при создании или сравнении подформатов. |
int |
hashCode() |
Генерирует код хэша для объекта формата сообщений. |
Object[] |
parse |
Парсит текст с начала заданной строки, чтобы получить массив объектов. |
Object[] |
parse |
Парсит строку. |
Object |
parseObject |
Парсит текст из строки, чтобы получить массив объектов. |
void |
setFormat |
Устанавливает формат для использования для элемента формата с заданным индексом элемента формата в ранее установленной строке шаблона. |
void |
setFormatByArgumentIndex |
Устанавливает формат для использования для элементов формата в ранее установленной строке шаблона, использующих заданный индекс аргумента. |
void |
setFormats |
Устанавливает форматы для использования для элементов формата в ранее установленной строке шаблона. |
void |
setFormatsByArgumentIndex |
Устанавливает форматы для использования для значений, переданных в методы format или возвращаемых методами parse. |
void |
setLocale |
Устанавливает локаль, которая будет использоваться при создании или сравнении подформатов. |
String |
toPattern() |
Возвращает шаблон, представляющий текущее состояние формата сообщений. |
Методы, унаследованные от класса java.text.Format
format, parseObject
Подробное описание конструкторов
MessageFormat
public MessageFormat(String pattern)
FORMAT и указанного шаблона. Конструктор сначала устанавливает локаль, затем анализирует шаблон и создаёт список подформатов для элементов форматирования, содержащихся в нём. Шаблоны и их интерпретация указаны в описании класса.- Параметры:
-
pattern- шаблон для этого формата сообщений - Исключения:
-
IllegalArgumentException- если шаблон некорректен -
NullPointerException- еслиpatternявляетсяnull
MessageFormat
public MessageFormat(String pattern, Locale locale)
- Параметры:
-
pattern- шаблон для этого формата сообщений -
locale- локаль для этого формата сообщений - Исключения:
-
IllegalArgumentException- если шаблон некорректен -
pattern- еслиpatternявляетсяnull - С:
- 1.4
Подробное описание методов
setLocale
public void setLocale(Locale locale)
- методов
applyPatternиtoPattern, если элементы форматирования указывают тип форматирования и, следовательно, подформаты создаются в методеapplyPattern, а также - методов
formatиformatToCharacterIterator, если элементы форматирования не указывают тип форматирования и, следовательно, подформаты создаются в методах форматирования.
- Параметры:
-
locale- локаль, используемая при создании или сравнении подформатов
getLocale
public Locale getLocale()
- Возвращает:
- используемая локаль при создании или сравнении подформатов
applyPattern
public void applyPattern(String pattern)
- Параметры:
-
pattern- шаблон для этого формата сообщений - Исключения:
-
IllegalArgumentException- если шаблон некорректен -
NullPointerException- еслиpatternявляетсяnull
toPattern
public String toPattern()
- Возвращает:
- шаблон, представляющий текущее состояние формата сообщений
setFormatsByArgumentIndex
public void setFormatsByArgumentIndex(Format[] newFormats)
format или возвращаемых методами parse. Индексы элементов в newFormats соответствуют индексам аргументов, используемым в строке шаблона, заданной ранее. Порядок форматов в newFormats таким образом соответствует порядку элементов в массиве arguments, переданном методам format, или массиву результатов, возвращаемому методами parse. Если индекс аргумента используется для более чем одного элемента форматирования в строке шаблона, то соответствующий новый формат используется для всех таких элементов форматирования. Если индекс аргумента не используется ни для какого элемента форматирования в строке шаблона, то соответствующий новый формат игнорируется. Если предоставлено меньше форматов, чем необходимо, то только форматы для индексов аргументов меньше newFormats.length заменяются.
- Параметры:
-
newFormats- новые форматы для использования - Исключения:
-
NullPointerException- еслиnewFormatsравно null - С:
- 1.4
setFormats
public void setFormats(Format[] newFormats)
newFormats соответствует порядку элементов форматирования в строке шаблона. Если предоставлено больше форматов, чем нужно строке шаблона, оставшиеся игнорируются. Если предоставлено меньше форматов, чем нужно, то только первые newFormats.length формата заменяются.
Поскольку порядок элементов форматирования в строке шаблона часто меняется во время локализации, обычно лучше использовать метод setFormatsByArgumentIndex, который предполагает порядок форматов, соответствующий порядку элементов в массиве arguments передаваемом методам format или массиву результатов, возвращаемому методами parse.
- Параметры:
-
newFormats- новые форматы для использования - Исключения:
-
NullPointerException- еслиnewFormatsравно null
setFormatByArgumentIndex
public void setFormatByArgumentIndex(int argumentIndex, Format newFormat)
arguments переданном методам format или массиву результатов, возвращаемому методами parse. Если индекс аргумента используется для более чем одного элемента форматирования в строке шаблона, то новый формат используется для всех таких элементов форматирования. Если индекс аргумента не используется ни для какого элемента форматирования в строке шаблона, то новый формат игнорируется.
- Параметры:
-
argumentIndex- индекс аргумента, для которого использовать новый формат -
newFormat- новый формат для использования - С:
- 1.4
setFormat
public void setFormat(int formatElementIndex, Format newFormat)
Поскольку порядок элементов форматирования в строке шаблона часто меняется во время локализации, обычно лучше использовать метод setFormatByArgumentIndex, который обращается к элементам форматирования на основе указанного ими индекса аргумента.
- Параметры:
-
formatElementIndex- индекс элемента форматирования в шаблоне -
newFormat- формат для использования для указанного элемента форматирования - Исключения:
-
ArrayIndexOutOfBoundsException- еслиformatElementIndexравно или больше количества элементов форматирования в строке шаблона
getFormatsByArgumentIndex
public Format[] getFormatsByArgumentIndex()
format или возвращаемых методами parse. Индексы элементов в возвращаемом массиве соответствуют индексам аргументов, используемым в строке шаблона, заданной ранее. Порядок форматов в возвращаемом массиве таким образом соответствует порядку элементов в массиве arguments переданном методам format или массиву результатов, возвращаемому методами parse. Если индекс аргумента используется для более чем одного элемента форматирования в строке шаблона, то формат, используемый для последнего такого элемента форматирования, возвращается в массиве. Если индекс аргумента не используется ни для какого элемента форматирования в строке шаблона, то в массив возвращается null.
- Возвращает:
- используемые форматы для аргументов в шаблоне
- С:
- 1.4
getFormats
public Format[] getFormats()
Поскольку порядок элементов форматирования в строке шаблона часто меняется во время локализации, обычно лучше использовать метод getFormatsByArgumentIndex, который предполагает порядок форматов, соответствующий порядку элементов в массиве arguments переданном методам format или массиву результатов, возвращаемому методами parse.
- Возвращает:
- форматы, используемые для элементов форматирования в шаблоне
форматировать
public final StringBuffer format(Object[] arguments, StringBuffer result, FieldPosition pos)
MessageFormat, заменяя элементы формата отформатированными объектами, в предоставленный StringBuffer. Текст, заменяющий отдельные элементы формата, извлекается из текущего подформата элемента формата и элемента arguments в индексе аргумента элемента формата, как указано в первой совпадающей строке следующей таблицы. Аргумент считается недоступным, если arguments равен null или содержит меньше чем argumentIndex+1 элементов.
| Подформат | Аргумент | Отформатированный текст |
|---|---|---|
| любой | недоступен |
"{" + argumentIndex + "}" |
null |
"null" |
|
instanceof ChoiceFormat |
любой |
subformat.format(argument).indexOf('{') >= 0 ? |
!= null |
любой |
subformat.format(argument) |
null |
instanceof Number |
NumberFormat.getInstance(getLocale()).format(argument) |
instanceof Date |
DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, getLocale()).format(argument) |
|
instanceof String |
argument |
|
| любой |
argument.toString() |
Если pos не равно null и относится к Field.ARGUMENT, будет возвращено расположение первой отформатированной строки.
- Параметры:
-
arguments- массив объектов для форматирования и подстановки. -
result- место для добавления текста. -
pos- отслеживает позицию первого заменённого аргумента в строке вывода. - Возвращает:
- буфер строк, переданный как
result, с добавленным отформатированным текстом - Исключение:
-
IllegalArgumentException- если аргумент в массивеargumentsне имеет типа, ожидаемого элементами формата, которые его используют. -
NullPointerException- еслиresultравноnull
форматировать
public static String format(String pattern, Object... arguments)
(new MessageFormat(pattern)).format(arguments, new StringBuffer(), null).toString()
- Параметры:
-
pattern- строка шаблона -
arguments- объекты для форматирования - Возвращает:
- отформатированная строка
- Исключение:
-
IllegalArgumentException- если шаблон неверный, или аргумент в массивеargumentsне имеет типа, ожидаемого элементами формата, которые его используют. -
NullPointerException- еслиpatternравноnull
форматировать
public final StringBuffer format(Object arguments, StringBuffer result, FieldPosition pos)
MessageFormat, заменяя элементы формата отформатированными объектами, в предоставленный StringBuffer. Это эквивалентно format((Object[]) arguments, result, pos)
- Указано в:
-
formatв классеFormat - Параметры:
-
arguments- массив объектов для форматирования и подстановки. -
result- место для добавления текста. -
pos- отслеживает позицию первого заменённого аргумента в строке вывода. - Возвращает:
- буфер строк, переданный как
toAppendTo, с добавленным отформатированным текстом - Исключение:
-
IllegalArgumentException- если аргумент в массивеargumentsне имеет типа, ожидаемого элементами формата, которые его используют. -
NullPointerException- еслиresultравноnull
formatToCharacterIterator
public AttributedCharacterIterator formatToCharacterIterator(Object arguments)
MessageFormat, создавая AttributedCharacterIterator. Вы можете использовать возвращённый AttributedCharacterIterator для построения результирующей строки, а также для определения информации о результирующей строке. Текст возвращённого AttributedCharacterIterator такой же, как бы возвращался
format(arguments, new StringBuffer(), null).toString() Кроме того, AttributedCharacterIterator содержит как минимум атрибуты, указывающие, где текст был сгенерирован из аргумента в массиве arguments. Ключи этих атрибутов имеют тип MessageFormat.Field, их значения — объекты Integer, указывающие на индекс в массиве arguments аргумента, из которого был сгенерирован текст.
Атрибуты/значения из подлежащих Format экземпляров, которые использует MessageFormat, также будут помещены в результирующий AttributedCharacterIterator. Это позволяет не только найти, где аргумент размещён в результирующей строке, но и какие поля он, в свою очередь, содержит.
- Переопределяет:
-
formatToCharacterIteratorв классеFormat - Параметры:
-
arguments- массив объектов для форматирования и подстановки. - Возвращает:
- AttributedCharacterIterator, описывающий отформатированное значение.
- Исключение:
-
NullPointerException- еслиargumentsравно null. -
IllegalArgumentException- если аргумент в массивеargumentsне имеет типа, ожидаемого элементами формата, которые его используют. - С:
- 1.4
распарсить
public Object[] parse(String source, ParsePosition pos)
Ограничения: Парсинг может потерпеть неудачу по ряду причин. Например:
- Если один из аргументов не встречается в шаблоне.
- Если формат аргумента теряет информацию, например, в формате выбора, где большое количество форматов отображается как "много".
- Пока не обрабатывает рекурсию (где подставленные строки содержат ссылки {n}).
- Не всегда найдёт соответствие (или правильное соответствие), если часть парсинга неоднозначна. Например, если шаблон "{1},{2}" используется со строковыми аргументами {"a,b", "c"}, он отформатирует как "a,b,c". При парсинге результата он вернёт {"a", "b,c"}.
- Если один аргумент парсится более одного раза в строке, то побеждает последний парсинг.
- Параметры:
-
source- строка для парсинга -
pos- позиция парсинга - Возвращает:
- массив распарсенных объектов
- Исключение:
-
NullPointerException- еслиposравноnullдля не-null строкиsource.
распарсить
public Object[] parse(String source) throws ParseException
См. метод parse(String, ParsePosition) для получения дополнительной информации о парсинге сообщений.
- Параметры:
-
source- Строка, начало которой должно быть обработано. - Возвращает:
- Массив объектов, распарсенных из строки.
- Исключение:
-
ParseException- если начало заданной строки не может быть обработано.
parseObject
public Object parseObject(String source, ParsePosition pos)
Метод пытается распарсить текст, начиная с индекса, заданного pos. Если парсинг успешен, то индекс pos обновляется до индекса после последнего использованного символа (парсинг не обязательно использует все символы до конца строки), и возвращается массив распарсенных объектов. Обновлённый pos может быть использован для указания начальной точки для следующего вызова этого метода. Если произошла ошибка, то индекс pos не изменяется, индекс ошибки pos устанавливается на индекс символа, где произошла ошибка, и возвращается null.
См. метод parse(String, ParsePosition) для получения дополнительной информации о парсинге сообщений.
- Указано в:
-
parseObjectв классеFormat - Параметры:
-
source- Строка, часть которой должна быть обработана. -
pos- Объект ParsePosition с информацией об индексе и индексе ошибки, как описано выше. - Возвращает:
- Массив распарсенных из строки объектов. В случае ошибки возвращает null.
- Исключение:
-
NullPointerException- еслиposравно null.
клонировать
public Object clone()
- Переопределяет:
-
cloneв классеFormat - Возвращает:
- клонированный экземпляр.
- См. также:
equals
public boolean equals(Object obj)
- Overrides:
-
equalsв классеObject - Parameters:
-
obj- ссылка на объект для сравнения. - Returns:
-
trueесли этот объект идентичен аргументу obj;falseв противном случае. - See Also:
hashCode
public int hashCode()
- Overrides:
-
hashCodeв классеObject - Returns:
- значение кода хэша для этого объекта.
- See Also:
© 1993, 2021, 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/17/docs/api/java.base/java/text/MessageFormat.html