Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 10
На сайте нет зарегистрированных пользователей

Пользователей: 13,361
новичок: uehuat
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

База данных - словарь терминов на Delphi + Пояснительная записка
Сравнение двух бинарных деревьев на Turbo Pascal + отчет
Расчет обратной матрицы на Delphi + Пояснительная записка

Форматирование вывода с помощью класса Formatter
Форматирование вывода с помощью класса Formatter

Базовой частью поддержки создания форматированного вывода в языке Java служит класс Formatter, включенный в пакет java.util. Он обеспечивает преобразования формата (format conversions) позволяющие выводить числа, строки и время и даты практически в любом понравившемся вам формате. Класс функционирует подобно функции printf () языков C/C++, а значит, если Вы знакомы с этими языками, научиться использовать класс Formatter будет очень легко. Кроме того, это позволит в будущем упростить преобразование кода на языках C/C++ в исходный код на языке Java. Если Вы не знаете языков C/C++, все равно очень легко освоить форматирование данных.
Кроме класса Formatter в Java 2 версии 5.0 добавлен метод printf () для классов printstream и printwriter. Метод printf () автоматически использует класс Formatter и предлагает функциональные средства почти один к одному совпадающие с возможностями функции printf () языков C/C++, таким образом, облегчая в дальнейшем преобразование кода на C/C++ в код на языке Java.

Замечание
Несмотря на то, что класс Formatter и метод printf() языка Java действуют аналогично функции printf() языков C/C++, у них есть некоторые отличия и новые свойства. Поэтому, даже если Вы знакомы с языками C/C++, советую все же внимательно прочесть эту главу.

Конструкторы класса Formatter

Прежде чем Вы сможете использовать класс Formatter для форматирования
вывода, Вам придется создать объект типа Formatter. В общем, класс Formatter преобразует двоичную форму представления данных, используемых программой, в форматированный текст. Он сохраняет форматированный текст в буфере, содержимое которого Ваша программа может получить в любой нужный момент. Можно предоставить классу Formatter автоматическую поддержку этого буфера, либо явно задать его, когда создается объект класса Formatter. Существует возможность сохранения буфера класса Formatter в файле.
В классе Formatter определено много конструкторов, которые позволяют создавать объекты этого класса различными способами. Далее приведены некоторые их образцы.

Formatter()
Formatter(Appendable buf)
Formatter(Appendable buf, Locale loc)
Formatter(String filename)
throws FileNotFoundException
Formatter(String filename, String charset)
throws FileNotFoundException, unsupportedEncodingException
Formatter(File outF)
throws FileNotFoundException
Formatter(OutStream outStrm)




В приведенных образцах buf задает буфер для форматированного вывода. Если параметр buf равен null, класс Formatter автоматически размещает объект типа StringBuilder для хранения форматированного вывода. Параметр loc определяет региональные и языковые настройки. Если никаких настроек не задано, используются настройки по умолчанию. Параметр filename задаст имя файла, который получит форматированный вывод. Параметр charset определяет кодировку. Если она не задана, используется кодировка, установленная по умолчанию. Параметр outF передаст ссылку на открытый файл, в котором будет храниться форматированный вывод. В параметре outStrm передается ссылка на поток вывода, который будет получать отформатированные данные. Если используется файл, выходные данные также записываются в файл.
Возможно, наиболее широко используемый конструктор, первый в приведенном перечне, — это конструктор без параметров. Он использует региональные настройки, принятые по умолчанию, и автоматически размещает объект класса StringBuilder для хранения форматированного вывода

Методы класса Formatter


void close()
void flush() Закрывает вызывающий объект класса Formatter, Это приводит к освобождению ресурсов, используемых объектом, После закрытия объекта типа Formatter, он не может повторно использоваться. Попытка использовать закрытый объект приводит к генерации исключения типа FormatterClosedException
Переносит информацию из буфера форматирования. Это вызывает запись в указанное место выходных данных, находящихся в буфере. Чаще всего используется объектом класса Formatter, связанным с файлом
Formatter format(String fmtString, Object...args) Форматирует аргументы, переданные в аргументе переменной длины (vararg) args, в соответствии со спецификаторами формата, содержащимися в fmtString. Возвращает вызывающий объект
Formatter format(Locale loc, String fmtString, Object...args) Форматирует аргументы, переданные в аргументе переменной длины args, в соответствии со спецификаторами формата, содержащимися в fmtString. При форматировании используются региональные установки, заданные в lос. Возвращает вызывающий объект
IOException ioException() Если объект, приемник отформатированного вывода, генерирует исключение типа lOException, возвращает это исключение. 8 противном случае возвращает null
Locale locale() Возвращает региональные установки вызывающего объекта
Appendable out() Возвращает ссылку на базовый объект-приемник для выходных данных
String toString() Возвращает объект типа String, содержащий отформатированный вывод

Основы форматирования

После создания объекта класса Formatter Вы можете его применить для формирования форматированной строки. Для этого используйте метод format (). В следующей строке приведена самая общеупотребительная его версия
Formatter format(String fmtString, Object...args)
Параметр fmtString состоит из элементов двух типов. Первый тип формируется из символов, которые просто копируются в буфер вывода. Второй тип содержит спецификаторы формата (format specifiers), определяющие способ отображения последующих аргументов.
Простейший спецификатор начинается со знака процента, за которым следует преобразующий спецификатор формата (format conversion specifier). Все преобразующие спецификаторы формата состоят из одиночных символов.
Например, спецификатор формата для данных с плавающей точкой — %f. Как правило, спецификаторов формата должно быть столько же, сколько аргументов первого типа, и соответствие спецификаторов формата аргументам первого типа устанавливается в направлении слева направо. Рассмотрим приведенный далее фрагмент:
Formatter fmt = new Formatter ();
fmt.format("Formatting %s is easy %d %£", "with Java", 10, 98.6);
в нем создается объект класса Formatter, содержащий следующую строку:
Formatting with Java is easy 10 98.600000
В данном примере спецификаторы формата: %s, %d и %f, замещаются аргументами, следующими далее в строке форматирования. Таким образом, спецификатор %s заменен строкой "with Java", спецификатор %d — числом 10, а спецификатор %f — числом 98.6. Все остальные символы используются без изменения. Как Вы могли догадаться, спецификатор %s задает строку, а спецификатор %<а — целое число. Как уже упоминалось, спецификатор %f задает значение с плавающей точкой.
Метод format() принимает множество разных спецификаторов формата, перечисленных в табл. 9.2. Обратите внимание на то, что у многих из них есть две формы представления: в верхнем и нижнем регистрах. Когда используется спецификатор, набранный в верхнем регистре, отображаются заглавные буквы. В остальном спецификаторы, набранные в верхнем и нижнем регистрах, выполняют одни те же преобразования, Важно знать, что язык Java контролирует соответствие каждого спецификатора формата типу связанного с ним аргумента. Если это соответствие нарушено, генерируется исключение типа IllegalFormatException.
После форматирования строки Вы можете получить ее, вызвав метод toString(). Если продолжить предыдущий пример, оператор, приведенный в следующей строке, получает отформатированную строку, содержащуюся в объекте fmt:
String str = fmt.toString();
Конечно, если Вы хотите просто вывести на экран отформатированную строку, не нужно ее сначала присваивать объекту типа String. Когда объект класса Formatter передается, например, в метод println(), метод toString() вызывается автоматически.

%a
%A Шестнадцатеричное значение с плавающей точкой
%B
%B Логическое (булево) значение аргумента
%c
%C Символьное представление аргумента
%d Десятичное целое значение аргумента
%h
%H Хэш-код аргумента
%e
%E Экспоненциальное представление аргумента
%f Десятичное значение с плавающей точкой
%g
%G Выбирает более короткое представление из двух: %е или %f
%o Восьмеричное целое значение аргумента
%n Вставка символа новой строки
%s
%S Строковое представление аргумента
%t
%T Время и дата
%x Шестнадцатеричное целое значение аргумента
%% Вставка знака %





В листинге 9.1 приведена короткая программа, в которой собраны все фрагменты, демонстрирующие создание и вывод на экран отформатированной строки.

Листинг 9.1. Простой пример использования класса Formatter

import java.util.*;

class FormatDemo {
public static void main(String args[]) {
Formatter fmt = new Formatter();

fmt.format("Formatting %s is easy %d %f", "with Java", 10, 98.6);

System.out.println(fmt);
}
}




Одно замечание: Вы можете получить ссылку на основной буфер вывода, вызвав метод out (). Он возвращает объект типа Appendabie. Интерфейс Арpendable включен в версию Java 2 5.0.
Теперь Вы познакомились с основным механизмом, применяемым для создания форматированной строки, в оставшейся части этого раздела будет подробно обсуждаться каждый вид преобразования, а также другие параметры форматирования, такие как выравнивание, минимальная ширина поля и точность представления данных.

Форматирование строк и символов


Для форматирования отдельного символа используйте спецификатор %с. Он обеспечивает вывод соответствующего символьного аргумента без преобразования. Для форматирования строки воспользуйтесь спецификатором %s.

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

Для представления целого числа в десятичном формате используйте спецификатор %d. Для представления десятичного значения с плавающей точкой воспользуйтесь спецификатором %f. Для экспоненциального представления значения с плавающей точкой применяйте спецификатор %е. Общий вид экспоненциального представления чисел приведен в следующей строке: х.dddddde+/-уу
Спецификатор формата %g заставляет объект класса Formatter использовать один из спецификаторов %f или %е, предлагающий более короткое представление аргумента. В листинге 9.2 демонстрируется эффект применения спецификатора формата %g.

Листинг 9.2. Применение спецификатора формата %g
import java.util.*;

class FormatDemo2 {
public static void main(String args[]) {
Formatter fmt = new Formatter();

for(double i=1000; i < 1.0e+10; i *= 100) {
fmt.format("%g ", i);
System.out.println(fmt);
}

}
}



Далее приведен вывод результатов работы программы из листинга 9.2:
1000.000000
1000.000000 100000.000000
1000.000000 100000.000000 1.000000е+07
1000.000000 100000.000000 1.000000е+07 1.000000е+09



Вы можете выводить целые значения в восьмеричном и шестнадцатеричном представлениях с помощью применения спецификаторов %о и %х соответственно. Например, следующая строка:
fmt.format("Hex: %x, Octal: %о", 196 196);
формирует следующий вывод:
Hex: c4, Octal: 304
Вы можете выводить значения с плавающей точкой в шестнадцатеричном представлении, используя спецификатор формата %а. Формат, создаваемый этим спецификатором, на первый взгляд может показаться странным. Дело в том, что в нем применяется форма представления числа, подобная экспоненциальной и состоящая из шестнадцатеричных мантиссы и порядка. В следующей строке приведен общий вид отформатированного числа:
0x1.sigpexp
в этой записи параметр sig содержит дробную часть мантиссы, а параметр ехр — порядок числа. Символ р отмечает начало порядка. Например, следующий вызов:
fmt.format (“%а”, 123.123);
формирует приведенный в следующей строке вывод:
0x1.ec7df3b645aldp6

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


Один из наиболее мощных спецификаторов преобразования формата — спецификатор %t. Он позволяет форматировать информацию о времени и дате. Этот спецификатор действует несколько иначе, чем другие, поскольку он требует применения суффикса для описания отображаемой части и точного формата выбранных времени и даты. Суффиксы перечислены в табл. 9.3. Например, для отображения минут, Вы могли бы использовать спецификатор %tM, в котором суффикс M показывает минуты в двух символьном поле. Аргумент, относящийся к спецификатору %t, должен быть типа Calendar, Date, Long или long.

Таблица 9.3. Суффиксы формата для вывода времени и даты

Суффикс Вывод, замещающий суффикс
а Сокращенное название дня недели
А Полное название дня недели
b Сокращенное название месяца
В Полное название месяца
c Стандартное представление в виде: день, месяц чч:мм:сс часовой пояс, год
С Первые две цифры года
d День месяца как десятичное целое (от 01 до 31)
D месяц/день/год
е День месяца как десятичное целое (от 1 до 31)
F год-месяц-день
h Сокращенное название месяца
Н Час (от 00 до 23)
I Час (от 1 до 12)
j Номер дня в году как десятичное целое (от 001 до 366)
к Час (от 0 до 23)
I Час (от 1 до 12)
L Миллисекунды (от 000 до 999)
m Десятичный номер месяца (от 01 до 13)
М Минуты как десятичное целое (от 00 до 59)
N Наносекунды (от 000000000 до 999999999)
P Региональный эквивалент AM или РМ заглавными буквами
p Региональный эквивалент AM или РМ строчными буквами
Q Миллисекунды от 1/1/1970
г чч:мм (12-часовой формат)
R чч:мм (24-часовой формат)
S Секунды (от 00 до 60)

В листинге 9.3 продемонстрировано применение нескольких форматов.

Листинг 9.3. Форматирование времени и даты
import java.util.*;

class TimeDateFormat {
public static void main(String args[]) {
Formatter fmt = new Formatter();
Calendar cal = Calendar.getInstance();

// Display standard 12-hour time format.
fmt.format("%tr", cal);
System.out.println(fmt);

// Display complete time and date information.
fmt = new Formatter();
fmt.format("%tc", cal);
System.out.println(fmt);

// Display just hour and minute.
fmt = new Formatter();
fmt.format("%tl:%tM", cal, cal);
System.out.println(fmt);

// Display month by name and number.
fmt = new Formatter();
fmt.format("%tB %tb %tm", cal, cal, cal);
System.out.println(fmt);
}
}




Далее приведен образец вывода программы из листинга 9.3:
09:17:15 AM
Sun Dec 12 09:17:15 CST 2004
9:17
December Dec 12



Спецификаторы %n и %%
Спецификаторы %n и %% отличаются от других спецификаторов формата тем, что они не связаны с аргументами. Они представляют собой ESC-последовательности, вставляющие символ в поток вывода. Спецификатор %n вставляет символ перехода на новую строку, а спецификатор %% — знак процента. Ни один из этих символов нельзя вставить непосредственно в строку формата. Конечно, Вы также можете использовать стандартную ESC-последовательность \n для внедрения символа перехода на новую строку.
В листинге 9.4 показано применение спецификаторов %n и %%.
Листинг 9.4. Демонстрация применения спецификаторов %n и %%.
import java.util.*;

class FormatDemo3 {
public static void main(String args[]) {
Formatter fmt = new Formatter();

fmt.format("Copying file%nTransfer is %d%% complete", 88);
System.out.println(fmt);
}
}



Далее приведен вывод результатов работы программы из листинга 9.4:
Copying file
Transfer is 88% complete
Задание минимальной ширины поля
Целое число, стоящее между знаком % и символом преобразования формата в спецификаторе, действует как спецификатор минимальной ширины поля (minimum field width specifier). Он заполняет вывод пробелами для того, чтобы аргумент достиг заданной минимальной длины. Если строка или число длиннее заданного минимума, они все равно будут отображены полностью. По умолчанию заполнение выполняется пробелами. Если Вы хотите заполнить поле нулями, поместите 0 перед спецификатором ширины поля. Например, спецификатор %05d дополнит слева число, состоящее меньше чем из пяти цифр, нулями так, чтобы его общая длина равнялась пяти цифрам. Спецификатор ширины поля может применяться со всеми спецификаторами формата за исключением спецификатора %n.
В листинге 9.5 показано применение спецификатора минимальной ширины поля, добавленного к спецификатору формата %f.

Листинг 9.5. Демонстрация применения спецификатора минимальной ширины поля
import java.util.*;

class FormatDemo4 {
public static void main(String args[]) {
Formatter fmt = new Formatter();

fmt.format("|%f|%n|%12f|%n|%012f|",
10.12345, 10.12345, 10.12345);

System.out.println(fmt);

}
}



Далее приведен вывод результатов работы программы из листинга 9.5:
|10.123450|
| 10/123450|
|00010.123450|



В первой строке показана текущая ширина поля для вывода числа 10.123450. Во второй строке отображается это же число в поле с 12-символьной шириной. В третьей строке выведено то же число в поле шириной 12 символов и дополнено ведущими нулями для заполнения ширины поля.
Спецификатор минимальной длины поля часто используется для выравнивания колонок при формировании таблиц. В листинге 9.6 создается таблица квадратов и кубов для чисел от 1 до 10.
Листинг 9.6. Создание таблицы квадратов и кубов
import java.util.*;

class FieldWidthDemo {
public static void main(String args[]) {
Formatter fmt;

for(int i=1; i <= 10; i++) {
fmt = new Formatter();

fmt.format("%4d %4d %4d", i, i*i, i*i*i);
System.out.println(fmt);
}

}
}



Опубликовал Kest January 13 2009 19:09:52 · 1 Комментариев · 34329 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Андрей December 05 2013 07:48:30
К сожалению в статье не упоминается явное указание порядка использования аргументов($).
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Visual Basic for ...
XPmenu
FormShape [Исходн...
WordReport
Создание Web-сайт...
Последние загруж...
Анекдоты с ostrie.ru
Text3D
Разработка клиент...
Bitmap [для кнопок]
Fig [Исходник на ...
AID антивирус
Handles
Calendar
Создание оригинал...
Сложный калькулятор
Tank [Исходник на...
StartMark
Crypt32
AntiRus

Топ загрузок
Приложение Клие... 100771
Delphi 7 Enterp... 97787
Converter AMR<-... 20259
GPSS World Stud... 17014
Borland C++Buil... 14186
Borland Delphi ... 10267
Turbo Pascal fo... 7372
Калькулятор [Ис... 5968
Visual Studio 2... 5205
Microsoft SQL S... 3661
Случайные статьи
Служба имен доменов
ОСНОВНЫЕ ВЫВОДЫ ПО...
Точный перечень ме...
9. На все участвую...
Программные инфрас...
Язык С: операции н...
Принципы взаимодей...
Применение техноло...
Системы экспертных...
Офлайн-версия сайт...
Использование прог...
Настраиваемые инте...
Заливка ячейки
Список файлов
Работа с настройка...
Каждый новый узел ...
Изменение размера ...
Протоколы распреде...
Применение метода ...
Instagram: раскрут...
Да, Microsoft чрез...
ВВЕДЕНИЕ В СПИСКИ
Зачем нужны команд...
Удаление открытых ...
Язык С: определени...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?