Форматирование java в word
В этом уроке мы продемонстрируем различные примеры форматирования с помощью метода 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 .
- Apache POI – HWPF и XWPF
- Зависимости POI Apache
- Создайте документ word
- Работа с абзацами, шрифтами и страницей перерывы
- Верхний и нижний колонтитулы документа
- Добавить изображение
- Создайте таблицу
- Прочитайте и проанализируйте документ, абзац и таблицу
- Обновить документ
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 старой школы с тем же названием.
Каждая техника имеет конкретные варианты использования, поэтому, надеюсь, вы сможете знать, когда использовать каждую из них в будущем.
Читайте также: