Форматирование java в word

Обновлено: 07.07.2024

В этом уроке мы продемонстрируем различные примеры форматирования с помощью метода printf () |/.

Метод является частью класса java.io.PrintStream и обеспечивает строгое форматирование, аналогичное функции printf() в C.

Дальнейшее чтение:

Руководство по java.util.Форматирующее устройство

Руководство по DateTimeFormatter

Заполните строку нулями или пробелами в Java

2. Синтаксис

Мы можем использовать один из этих методов PrintStream для форматирования выходных данных:

Мы задаем правила форматирования с помощью параметра формат . Правила начинаются с символа % .

Давайте рассмотрим краткий пример, прежде чем мы углубимся в детали различных правил форматирования:

Это приводит к следующему результату:

Как показано выше, строка формата содержит обычный текст и два правила форматирования. Первое правило используется для форматирования строкового аргумента. Второе правило добавляет символ новой строки в конец строки.

2.1. Правила Форматирования

Давайте рассмотрим строку формата более внимательно. Он состоит из литералов и спецификаторов формата. Спецификаторы формата включают флаги, ширину, точность и символы преобразования в этой последовательности:

Спецификаторы в скобках являются необязательными.

Внутренне printf() использует java.util.Форматер класс для анализа строки формата и создания выходных данных. Дополнительные параметры строки формата можно найти в файле Форматирования Javadoc .

2.2. Символы Преобразования

То преобразование-символ требуется и определяет, как форматируется аргумент.

Символы преобразования допустимы только для определенных типов данных. Вот некоторые из наиболее распространенных:

  • s форматирует строки.
  • d форматирует десятичные целые числа.
  • f форматирует числа с плавающей запятой.
  • t форматирует значения даты/времени.

Мы рассмотрим их и несколько других позже в этом уроке.

2.3. Дополнительные Модификаторы

[Флаги] определяют стандартные способы изменения выходных данных и наиболее распространены для форматирования целых чисел и чисел с плавающей запятой.

[Ширина] задает ширину поля для вывода аргумента. Он представляет минимальное количество символов, записанных в вывод.

[.точность] указывает количество цифр точности при выводе значений с плавающей запятой. Кроме того, мы можем использовать его для определения длины подстроки для извлечения из Строки .

3. Разделитель Строк

Чтобы разбить строку на отдельные строки, у нас есть спецификатор % new :

Приведенный выше фрагмент кода приведет к следующему результату:

То %n разделитель printf() автоматически вставит собственный разделитель строк хост-системы.

4. Логическое Форматирование

Для форматирования логических значений мы используем формат %b . Это работает следующим образом: если входное значение true , то выходное значение true . В противном случае вывод будет false .

Итак, если мы сделаем следующее:

тогда мы посмотрим:

Обратите внимание, что мы можем использовать %B для форматирования в верхнем регистре.

5. Форматирование Строк

Чтобы отформатировать простую строку, мы будем использовать комбинацию %s . Кроме того, мы можем сделать строку в верхнем регистре:

И это результат:

Кроме того, чтобы указать минимальную длину, мы можем указать ширину :

Если нам нужно оправдать нашу строку слева, мы можем использовать – флаг :

Это и есть результат:

Более того, мы можем ограничить количество символов в наших выходных данных, указав точность :

Для нашего примера здесь выводится Привет .

6. Форматирование Символов

Результатом %c является символ Юникода:

Заглавная буква C будет прописной в результате:

Но если мы дадим ему недопустимый аргумент, то Форматер выдаст Исключение IllegalFormatConversionException .

7. Форматирование Чисел

7.1. Целочисленное Форматирование

Метод printf() принимает все целые числа, доступные в языке — байт , короткий , int , длинный и BigInteger , если мы используем %d :

С помощью символа d мы получим такой результат:

В случае, если нам нужно отформатировать наш номер с разделителем тысяч, мы можем использовать флаг , |//. И мы также можем отформатировать наши результаты для разных регионов:

Как мы видим, форматирование в США отличается от форматирования в Италии:

7.2. Плавающее и двойное форматирование

Чтобы отформатировать число с плавающей точкой, нам понадобится формат f :

Здесь мы определяем ширину нашего числа как 5 , а длина десятичной части равна 2:

Здесь у нас есть отступ в один пробел от начала числа для поддержки заданной ширины.

Чтобы получить наш вывод в научной нотации, мы просто используем символ преобразования e :

И это наш результат:

8. Форматирование даты и времени

Для форматирования даты и времени строка преобразования представляет собой последовательность из двух символов: t или T символ и суффикс преобразования.

Давайте рассмотрим наиболее распространенные символы суффиксов форматирования времени и даты с примерами.

Определенно, для более продвинутого форматирования мы можем использовать DateTimeFormatter, который доступен с Java 8.

8.1. Форматирование Времени

Во-первых, давайте посмотрим список некоторых полезных символов суффикса для форматирования времени:

  • Символы H,M,Sотвечают за извлечение часов, минут и секунд из ввода Даты .
  • L , N представляют время в миллисекундах и наносекундах соответственно.
  • pдобавляет форматирование утра/вечера.
  • zвыводит смещение часового пояса.

Теперь предположим, что мы хотим распечатать временную часть Даты :

Приведенный выше код вместе с комбинацией %tT выдает следующий результат:

В случае, если нам потребуется более подробное форматирование, мы можем запросить различные временные сегменты:

Используя H , M и S , мы получаем этот результат:

Однако перечисление даты несколько раз-это боль.

В качестве альтернативы, чтобы избавиться от нескольких аргументов, мы можем использовать ссылку на индекс нашего входного параметра, которая в нашем случае равна 1$ :

Здесь мы хотим в качестве выходных данных текущее время, утра/вечера, время в миллисекундах и наносекундах, а также смещение часового пояса:

8.2. Форматирование Даты

Как и форматирование времени, у нас есть специальные символы форматирования для форматирования даты:

  • Aраспечатывает полный день недели.
  • d форматирует двузначный день месяца.
  • Bэто для полного названия месяца.
  • m форматирует двузначный месяц.
  • Yвыводит год в четырехзначном виде.
  • y выводит две последние цифры года.

Предположим, мы хотим показать день недели, за которым следует месяц:

Затем, используя A , B и Y , мы получим этот вывод:

Чтобы все наши результаты были в числовом формате, мы можем заменить A , B , Y буквы на d , m , y :

9. Заключение

Наконец, как всегда, код, использованный во время обсуждения, можно найти на GitHub .

Для языка Java (как, впрочем, и для любого другого языка программирования) всё еще не придумали более простого и действенного способа генерации документов docx, чем библиотека Apache POI. В конце нулевых появился сей высокоуровнеый API, позволящий говорить с формируемым документом не на языке разметки XML, а с помощью удобных полей и выводов.

Судя по моим Google-запросам на протяжении более чем года сообщество пользователей этой библиотеки продержалось года этак до 2012, в то время как новые версии библиотеки всё еще появляются на главной странице проекта. Не на все вопросы, касающиеся формирования самого примитивного документа, есть ответы в документации или stackoverflow, не говоря уже о текстах на русском языке. Постараемся компенсировать этот недостаток данных для тех, кому это может понадобиться.

Основные классы API

XWPFDocument — целостное представление Word документа. В нём не только содержится xml-код, интерпретируемый редакторами (Word, LibreOffice), но также содержатся и методы для определения метаданных отображения — набора стилей, сносок и т.п. В этой статье поговорим о первом, так как работа с метаданными не так явно задокументирована, к тому же многие редакторы успешно справляются с отображением документа и без подсказок.

Итак, предположим, у вас на руках есть (ненужный) файл docx. Преобразуем его в файл zip (осторожно, обратное преобразование путем переименования zip -> docx может сделать файл недоступным для вашего редактора(!)), в получившемся архиве откроем папку word, а в ней — файл document.xml. Перед нами xml-представление word-файла, которое также можно было бы получить через Apache POI, с меньшими трудностями.


Для того, чтобы поближе познакомиться с содержимым документа, придется вооружиться еще двумя классами API: XWPFParagraph и XWPFTable.

XWPFParagraph — как следует из названия, представляет собой параграф документа. Расположен он может быть как внутри XWPFDocument,


так и внутри таблицы (если точнее — внутри ячейки таблицы, вложенной в ряд таблицы, вложенного непосредственно в таблицу).


Параграф предоставляет изрядный набор информации для вёрстки и размещения текста. Официальная документация на этот счёт достаточно красноречива: отступы слева и справа, сверху и снизу, в том числе и между строками, добавление гиперссылок и границ для параграфа.

XWPFTable — класс, олицетворяющий таблицу. Также как и в XWPFParagraph, XWPFTable можно добавлять к самому документу и к ячейке таблицы (создавая, тем самым, таблицу внутри таблицы). Семантика в таком случае чуточку усложняется.


XWPFRun — набор данных о выводе текста внутри параграфа. Находится может только внутри параграфа, создается через вызов метода параграфа-родителя:


Из нескольких «ранов», как я предпочитаю их называть, и состоит целый параграф текста в Word. Каждый «ран» имеет свою настройку шрифта, его цвета и размера, а также стилизации. Через добавление различных «ранов», подчиняющихся разметке параграфа, можно выводить тексты с совершенно разной стилизацией.

Как становится видно из обзора классов, перенос, скажем, css-стиля в документ будет связан с дополнительной сложностью: часть свойств необходимо будет применить к параграфу docx, часть — к объекту класса XWPFRun.

Итак, библиотека легла в External Libraries/jar лежит под рукой, пора творить.

Создадим документ, добавим таблицу 2х2 и параграф.


Заполним параграф, добавив ран для вывода текста. После перевода строки стилизация параграфа будет потеряна, и в Word новый параграф будет выведен без красной строки.


Теперь займёмся заполнением таблицы. Мы можем обращаться не только к уже созданным элементам, но и вызвать у сформированной таблицы метод для добавления рядов или колонок.


Опускаемся глубже, на уровень ряда таблицы. Именно в таком порядке предстаёт разбор таблицы в Apache POI — сначала ряды, потом клетки. Напрямую из таблицы можно получить лишь количество колонок в таблице:


Оказавшись в ячейке двигаться глубже уже некуда, поэтому можно снова вызвать наш дуболомный метод по заполнению параграфа, предварительно создав его в таблице.

Итак, можно легко уловить суть структуры документа в Word: вкладывай одно в другое и предоставляй доступ (в том числе и к созданию новых экземпляров). К сожалению, далеко не всегда есть возможность получить последний элемент во вложенной коллекции. Чаще всего приходится пользоваться такими вот ухищрениями:


Хорошо, с содержимым таблицы разобрались. Что если нам нужно явно уточнить ширину таблицы, а не оставлять её для волной интерпретации редактора?

Для некоторых на первый взгляд числовых значений, например, ширины таблицы, в Apache POI существуют целые классы.


С помощью типа укажем, какая именно ширина нам нужна: auto, pct или dxa. В первом случае таблицы займёт всю предоставленную ей ширину, во втором — процент от всей ширины, указанный позже методом setW. В нашем же случае вмешиватеся специальная единица измерения — dxa, равная 1/20 точки.

Классы, подобные CTTblWidth, используются повсеместно: для определения ширины страницы (PgSize), ширины ячейки и др.

Единцы измерения в Apache POI

В хорошем документе всё выверенно и расчерчено идеально, вплоть до самого пикселя. Возможно, в теории можно сделать всё средствами Apache POI и без углубления в тему единиц измерения, но лучше уделить им внимание сразу, чтобы избежать недопониманий в духе «почему это схлопнулось» и «когда переместил картинку в word на один сантиметр».

О поддержке сантиметров и остальной метрической системы тут остается только мечтать. Это резонно (каждый шрифт уникален, у каждого редактора своя специфика), но дико неудобно. Придется прибегнуть ко множеству конвертаций, если вы хотите задавать отступы (ведь именно в сантиметрах мы привыкли видеть их в word) в сантиметрах. Итак, указав тип измерения dxa для некоторой ширины, как описно в параграфе выше, мы получаем в распоряжение некоторое точное значение, но абсолютно не представляем как им воспользоваться. Для перевода в сантиметры на stackoverflow есть формула. Для всего остального существует класс Units. В нем определены как методы для перевода единиц измерения, так и сами соотношения между значениями.

Запись готового документа

Для записи в конечный файл есть удобный метод XWPFDocument — write. На вход принимается поток, в который пойдёт запись.


Если готовый документ нужно куда-то передать можно подать в качестве аргумента не File-, а ByteArrayOutputStream.

Информация об элементе отображения в формате xml

Имея документ, отображающийся корректно в определенном редакторе, полезно было бы узнать как именно представлен необходимый параграф или другой элемент. Для этого определенны специальные методы, возвращающие объекты классов пакета org.openxmlformats.schemas.wordprocessingml.x2006.main. Из названия (wordprocessingml) видно, что данный набор классов используется только для работы с документами word. Например, для xlsx документов есть пакет spreadsheetml, некоторые классы которого очень и очень похожи на классы wordprocessingml, поэтому конвертация между форматами достаточно затруднена.


Так, пустой параграф будет иметь скромное представление


Пустая таблица покажет больше интересного.


Что здесь интересного? Свойства tblPr — всевозможные свойства таблицы. Внутри уже описанная ширина таблицы (установлена 0, но свойство «auto» все равно выведет таблицу в приемлимой, автоматической ширине). Также tblBorders — набор информации о границах таблицы. Далее идёт явно выраженное представление внутренностей таблицы. tr — ряд таблицы, внутри вложенны tc. Внутри tc оказался бы набор вложенный параграфов, если бы мы добавили хотя бы один.
Попробуем пополнить параграф информацией и посмотреть что из этого получится.


Здесь ситуация ровно такая же: объект с мета-информацией (в него добавлена информация об отступе красной строки, который мы вложили в коде), а так же само содержимое: там размещается список «ранов». В первый и единственный мы добавили текст и информацию о шрифте. Эта информация также разделилась внутри «рана» — информация о шрифте попала в rPr, сам текст — в элемент t.

В этой статье показано, как Apache POI используется для чтения, анализа и записи документа Microsoft Word.

Автор оригинала: Nikita Masand.

В этой статье мы научимся читать и писать Microsoft Word с помощью библиотеки POI Apache .

  1. Apache POI – HWPF и XWPF
  2. Зависимости POI Apache
  3. Создайте документ word
  4. Работа с абзацами, шрифтами и страницей перерывы
  5. Верхний и нижний колонтитулы документа
  6. Добавить изображение
  7. Создайте таблицу
  8. Прочитайте и проанализируйте документ, абзац и таблицу
  9. Обновить документ

P.S Протестировано с Apache POI 4.1.2 и Java 8

1. Apache POI – HWPF и XWPF

Apache POI предоставляет API Java для работы с документами Microsoft. Мы рассмотрим варианты использования, включающие абзацы, шрифты, верхние и нижние колонтитулы, таблицы, изображения, запись, чтение, анализ и обновление документа. Прежде чем изучить варианты использования, давайте рассмотрим основные концепции, связанные с библиотекой POI Apache.

1.1 HWPF (ужасный формат текстового процессора) Эти API-интерфейсы предназначены для более старых форматов файлов Word 6 и Word 95, .doc документы.

1.2 XWPF (формат текстового процессора XML) Эти API предназначены для новых документов Word 2007, .docx .

Документ XWPFDocument Он предоставляет API-интерфейсы высокого уровня для создания / редактирования файлов .docx word
xwpfпараграф Он используется для работы с абзацами
XWPFRun Он определяет область текста с общим набором свойств. Он также используется для редактирования свойств шрифта
XWPFTable Он используется для описания содержимого компонента таблицы, присутствующего в файле word
XWPFTableRow Он определяет строки, присутствующие в компоненте таблицы
Xwpfвордэкстрактор Он используется для извлечения текста из файла word

P.S Эта статья будет посвящена последним XWPF API-интерфейсы, работа с .docx документы.

2. Зависимости POI Apache

Нам нужен только poi-ooxml для работы с Microsoft word.

3. Создайте документ word

В этом примере показано, как создать файл Microsoft Word .docx . Мы используем XWPFParagraph для создания абзацев и XWPFRun для создания текста.

4. Работа с абзацами, шрифтами и разрывы страниц

Мы можем использовать XWPFRun для настройки свойств стиля шрифта. Он содержит методы изменения свойств шрифта, таких как цвет, размер шрифта, курсив, жирный шрифт, заглавные буквы, тиснение и многое другое.

Мы создаем четыре абзаца и устанавливаем различные свойства шрифта, разрывы строк и разрывы страниц для каждого из них.

5. Верхний и нижний колонтитулы документа

В этом примере создается верхний и нижний колонтитулы документа для всех страниц.

6. Добавить изображение

В этом примере в документ добавляется изображение.

7. Создайте таблицу

В этом примере мы рассмотрим, как мы можем вставить таблицу в файл документа Word. Мы будем использовать компонент XWPFTable для создания и инициализации элемента таблицы.

В этом примере вставляется таблица, содержащая 3 строки и 3 столбца.

P.S Предупреждение для OpenOffice 4.1.7, API-интерфейсы таблиц неправильно отформатировали таблицу.

8. Прочитайте и проанализируйте документ, абзац и таблицу.

В этом примере будет показано, как мы можем использовать POI Apache для извлечения и считывания текста из документов.

8.1 Мы можем извлечь весь текст из документа с помощью XWPFWordExtractor . Файл simple.docx генерируется из примера 4. Работа с абзацами, шрифтами и разрывами страниц .

8.2 В этом примере мы используем doc.getparagraphs() для списка абзацев документа. Как только мы получим список, мы сможем повторить отдельные элементы абзаца и получить текст.

8.3 Файл table.docx генерируется из примера 7. Создайте таблицу . Нам нужно получить список всех элементов в файле, а затем выполнить итерацию по нему, чтобы проверить наличие компонента ТАБЛИЦА . Как только мы найдем компонент ТАБЛИЦА , мы можем выполнить итерацию по нему, чтобы извлечь строки таблицы, и, наконец, выполнить итерацию по строкам, чтобы извлечь значения таблицы.

9 . Обновить документ

В этом примере мы будем использовать предварительно заполненный файл шаблона template.docx . Файл шаблона содержит следующий текст Привет $, Поздравляю, вы учитесь чему-то новому! . И мы заменим строку $ предопределенным вводом и создадим новый файл output.docx с обновленным содержимым.

Дальнейшее чтение Для получения дополнительных примеров, пожалуйста, обратитесь к этому официальному Примеры Apache POI XWPF

Вступление

В Java существует несколько способов форматирования строк. Некоторые из них старой школы и заимствованы непосредственно из старой классики (например, printf из C), в то время как другие больше соответствуют духу объектно-ориентированного программирования, например, класс MessageFormat .

В этой статье мы рассмотрим несколько из этих подходов. Мы покажем некоторые особенности того, как можно использовать каждую из техник и в каких обстоятельствах. Используя эти знания, вы будете знать, как подходить к форматированию строк и какие методы использовать.

System.out.printf()

Давайте начнем со старой классики, printf() . Как упоминалось ранее, printf() происходит из языка программирования C и расшифровывается как формат печати . Под капотом printf() использует java.util.Форматер , о котором мы поговорим позже.

То, как работает printf () , можно объяснить его аргументами. Наиболее распространенный способ использования printf() заключается в следующем:

аргументы vararg удобно ожидает аргументы (т. Е. Значения) для строки шаблона. Например, если шаблон содержит заполнители для двух чисел, метод printf() также будет ожидать два числа в качестве аргументов :

Мы поместили два символа %d в строку шаблона. Эти два символа представляют собой заполнители для определенного типа значений. Например, %d является заполнителем для десятичного числового значения. Поскольку у нас их два, мы должны передать два аргумента, соответствующих числовым значениям, таким как 42 и 23 .

Выполнение этого кода приведет к:

Спецификаторы Формата

С помощью printf () вы можете печатать такие значения , как числа, строки, даты и т.д. Чтобы метод знал, что именно вы пытаетесь распечатать, вам необходимо указать спецификатор формата для каждого из значений. Давайте рассмотрим пример:

В случае выполнения этот код выведет Привет, читатель на консоль. Символ %s представляет спецификатор формата для строк, аналогично тому, как %d представляет спецификатор формата для десятичных чисел.

Существует множество спецификаторов формата, которые мы можем использовать. Вот некоторые из наиболее распространенных:

Если мы хотим напечатать, например, символ и восьмеричное число, мы будем использовать %c и %o спецификаторы соответственно. Вы можете заметить что-то необычное: спецификатор новой строки. Если вы не привыкли к поведению printf () из C, может показаться немного странным указывать такие вещи.

Ну, printf() по умолчанию не пишет новую строку. На самом деле, по умолчанию он почти ничего не делает. В принципе, если вы хотите, чтобы что-то произошло, вы должны сделать это сами.

Результатом было бы:

Хотя, если мы включим символ новой строки:

Тогда результат был бы:

Escape-символы

В дополнение к описанным выше спецификаторам формата существует еще один тип символов форматирования: Escape-символы.

Давайте представим, что мы хотим напечатать символ " с помощью printf() . Мы можем попробовать что-то вроде:

Если вы попытаетесь запустить это, ваш компилятор наверняка выдаст исключение. Если вы посмотрите внимательно, даже код, который выделяет код на этой странице, выделит ); как строку, а не закрытую скобку метода.

Произошло то, что мы попытались напечатать символ, который имеет особое, скрытое значение. Кавычки используются для обозначения начала и конца строки.

Мы начали и закончили строку "" , после чего открыли другую " , но не закрыли ее. Это делает печать зарезервированных символов, подобных этому , невозможной при использовании этого подхода.

Комбинация \ и " конкретно указывает компилятору, что мы хотели бы вставить символ " в это место и что он должен рассматривать " как конкретное значение, а не зарезервированный символ.

Применение escape-символа \ может вызвать различные эффекты, основанные на последующем. Передача обычного символа (не зарезервированного) ничего не даст, и \ будет рассматриваться как значение.

Хотя некоторые комбинации (также называемые командами) имеют другое значение для компилятора:

Таким образом, вы бы использовали \n для печати разделителя строк на консоль, эффективно начиная любое новое содержимое с начала следующей строки. Аналогично, для добавления вкладок вы бы использовали спецификатор \t .

Возможно, вы заметили %% в качестве последней комбинации.

Почему это так? Почему \% просто не используется?

Символ % уже является escape-символом специально для метода printf () . За ними следуют такие символы, как d , i , f и т.д., форматер во время выполнения знает, как обрабатывать эти значения.

Для компилятора % не является специальным символом, но \ является. Кроме того, это условно, что специальные символы сами убегают. \ сбегает \ и % сбегает % .

Основное Использование

Давайте отформатируем строку с несколькими аргументами разных типов:

Поплавок и двойная точность

С помощью printf () мы можем определить пользовательскую точность для чисел с плавающей запятой:

Выполнение этого кода дает:

Заполнение Формата

Мы также можем добавить заполнение, включая переданную строку:

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

Вместо этого вы также можете добавить отступ справа:

Место действия

Мы также можем передать Locale в качестве первого аргумента, отформатировав строку в соответствии с ним:

Это приведет к получению двух целых чисел разного формата:

Индекс Аргументов

Если индекс аргумента не указан, аргументы будут просто следовать порядку присутствия в вызове метода:

Это привело бы к:

Однако после % escape-символа и перед спецификатором формата мы можем добавить другую команду. $n укажет индекс аргумента:

Здесь 2$ находится между % и d . 2$ указывает, что мы хотели бы прикрепить второй аргумент из списка аргументов к этому спецификатору. Аналогично, 1$ указывает, что мы хотели бы присоединить первый аргумент из списка к другому указанному.

Выполнение этого кода приводит к:

Вы можете указать обоим спецификаторам на один и тот же аргумент. В нашем случае это означало бы, что мы используем только один аргумент, указанный в списке. Это совершенно нормально, хотя нам все равно придется указать все аргументы, присутствующие в строке шаблона:

System.out.формат()

Прежде чем говорить о System.out.format() , давайте кратко остановимся на System.out .

Этот класс имеет множество различных методов для печати форматированных текстовых представлений в поток, некоторые из которых являются format() и printf() .

Согласно документации, они оба ведут себя совершенно одинаково . Это означает, что между ними нет разницы, и их можно использовать для одних и тех же результатов. Все, что мы до сих пор говорили о printf () , также работает для format() .

Как printf () , так и System.out.format() печать в канал stdout , который обычно нацелен на консоль/терминал.

Строка.формат()

Другим способом форматирования строк является метод String.format() , который внутренне также использует java.util.Форматер , который мы рассмотрим в следующем разделе.

Теперь вы можете делать все, что захотите, с отформатированной строкой . Вы можете распечатать его, сохранить в файл, изменить или сохранить в базе данных. Печать этого приведет к:

Метод String.format() использует тот же базовый принцип, что и метод printf () . Оба внутренне используют класс Форматирования для фактического форматирования строк. Таким образом, все, что сказано для printf () , также относится к методу String.format () .

Тем не менее, String.format() более универсален, поскольку вы действительно можете использовать результат более чем одним способом.

Класс форматирования

Поскольку все вышеперечисленные методы по своей сути вызывают Форматер , знание только одного означает, что вы знаете их все.

Использование Форматирования очень похоже на другие методы, показанные ранее. Самая большая разница заключается в том, что для его использования необходимо создать экземпляр Форматера объекта:

В связи с этим возникает вопрос:

Почему бы мне не всегда просто использовать предыдущие методы, поскольку они более лаконичны?

Есть еще одно важное различие, которое делает класс Форматер довольно гибким:

Вместо работы только с String s, Форматер также может работать с StringBuilder , что позволяет (повторно)эффективно использовать оба класса.

На самом деле, Форматер способен работать с любым классом, реализующим Добавляемый интерфейс. Одним из таких примеров является вышеупомянутый StringBuilder , но другие примеры включают такие классы, как BufferedWriter , Файловая машина , Поток печати , PrintWriter , StringBuffer и т.д. Полный список можно найти в документации .

Наконец, все спецификаторы формата, escape-символы и т. Д. Также допустимы для класса форматирования , Поскольку это основная логика форматирования строк во всех трех случаях: String. format() , printf () и Форматирование .

Наконец, давайте покажем один последний метод форматирования, который не использует Форматер под капотом.

Кодовый кредит: Документы Oracle

На выходе получается:

Вместо спецификаторов процента, которые мы видели до сих пор, здесь мы используем фигурные скобки для каждого из аргументов. Давайте возьмем первый аргумент, . Число 1 представляет индекс аргумента, который следует использовать вместо него. В нашем случае аргументами являются планета , новая дата () и событие .

Вторая часть, время , относится к типу значения. Типы форматов верхнего уровня: число , дата , время и выбор . Для каждого из значений можно сделать более конкретный выбор, например, с помощью , в котором говорится, что значение следует рассматривать не только как число, но и как целое число.

Полный набор типов и подтипов форматов можно найти в документации .

Вывод

В этой статье мы рассмотрели довольно много способов форматирования строк в ядре Java.

Каждая из техник, которые мы показали, имеет свою собственную причину существования. printf() , например, напоминает метод C старой школы с тем же названием.

Каждая техника имеет конкретные варианты использования, поэтому, надеюсь, вы сможете знать, когда использовать каждую из них в будущем.

Читайте также: