Класс 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 = {Long.valueOf(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 = {Long.valueOf(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 = {Double.valueOf(3.1415)}; String result = mf.format( objs ); // result now equals "3.14, 3.1" objs = mf.parse(result, new ParsePosition(0)); // objs now equals {Double.valueOf(3.1)}
Аналогично, при разборе с помощью объекта MessageFormat с шаблонами, содержащими несколько вхождений одного и того же аргумента, будет возвращено последнее совпадение. Например,
MessageFormat mf = new MessageFormat("{0}, {0}, {0}"); String forParsing = "x, y, z"; Object[] objs = mf.parse(forParsing, new ParsePosition(0)); // objs now equals {new String("z")}
Синхронизация
Форматы сообщений не синхронизированы. Рекомендуется создавать отдельные экземпляры формата для каждого потока. Если несколько потоков одновременно обращаются к формату, необходимо обеспечить внешнюю синхронизацию.
- Since:
- 1.1
- See Also:
Краткое описание вложенных классов
| Modifier and Type | Class | Описание |
|---|---|---|
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)
- Требования к реализации:
- Реализация по умолчанию выбрасывает
NullPointerExceptionеслиlocaleимеет значениеnullлибо во время создания объектаMessageFormat, либо позже, когдаformat()вызывается экземпляромMessageFormatс null локалём, и реализация использует подформат, зависящий от локали. - Параметры:
-
pattern- шаблон для этого формата сообщений -
locale- локаль для этого формата сообщений - Исключения:
-
IllegalArgumentException- если шаблон некорректен -
NullPointerException- еслиpatternимеет значениеnullилиlocaleимеет значениеnullи реализация использует подформат, зависящий от локали. - C:
- 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 - C:
- 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- новый формат для использования - C:
- 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.
- Возвращает:
- форматы, используемые для аргументов в шаблоне
- C:
- 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, или если экземплярMessageFormat, вызывающий этот метод, имеет локаль, установленную в 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, или если экземплярMessageFormat, вызывающий этот метод, имеет локаль, установленную в 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.
clone
public Object clone()
- Overrides:
-
clonein classFormat - Returns:
- клонированный экземпляр этого объекта.
- See Also:
equals
public boolean equals(Object obj)
- Overrides:
-
equalsin classObject - Parameters:
-
obj- эталонный объект, с которым следует сравнить. - Returns:
-
trueесли этот объект идентичен аргументу obj;falseв противном случае. - See Also:
hashCode
public int hashCode()
- Overrides:
-
hashCodein classObject - Returns:
- значение хэш-кода для этого объекта.
- See Also:
© 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/text/MessageFormat.html