Главная страница

Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция


Скачать 25.04 Mb.
НазваниеС. Н. Тригуб Перевод с английского и редакция
АнкорJava. Полное руководство. 8-е издание.pdf
Дата28.02.2017
Размер25.04 Mb.
Формат файлаpdf
Имя файлаJava. Полное руководство. 8-е издание.pdf
ТипДокументы
#3236
страница50 из 90
1   ...   46   47   48   49   50   51   52   53   ...   90
class FormatDemo {
public static void main(String a r g s []) {
Formatter fmt = new Formatter();
fm t Форматирование %s просто %d %f " /
" с Java", 10,
98.6);
System.out.println(fmt);
fmt.c l o s e (Еще один момент вы можете получить ссылку на выходной буфер, вызывая метод o u t ( )
. Он возвращает ссылку на объект интерфейса Теперь, когда вы знакомы с общим механизмом создания форматированных строк, подробно рассмотрим каждое преобразование. Кроме того, опишем такие параметры, как выравнивание, минимальная ширина поля и точность.
Форматирование строки символов
Для форматирования индивидуального символа используйте спецификатор с. В результате соответствующий символьный аргумент будет выводиться без каких- либо модификаций. Чтобы отформатировать строку, применяйте спецификатор %s.
Глава 18. Пакет java.util: прочие служебные классы 6 Форматирование чисел
Чтобы форматировать целые числа в десятичном формате, используйте спецификатор %d. Чтобы форматировать значения с плавающей точкой в десятичном формате, применяйте спецификатор % f . Для форматирования значений сплаваю щей точкой в научной нотации указывайте спецификаторе. Числа, представленные в научной нотации, принимают следующую общую форму, х. dddddde
+/-уу
Спецификатор формата д заставляет класс F o r m a t t e r использовать либо спецификатор %f, либо е, в зависимости оттого, что короче. В следующей программе демонстрируется эффект спецификатора формата д Демонстрирует применение спецификатора формата % д .
import java.util.*;
class FormatDemo2 {
public static void main(String a r g s []) {
Formatter fmt = new Formatter();
for(double i=1000; i < 1.0e+10; i *= 100) {
fmt.format("%g ", i );
System.out.println(fmt);
}
f m t .c l o s e (Эта программа дает такой выводе е 1.000000е+09
Вы можете отображать целые числа в восьмеричном или шестнадцатеричном формате, используя соответственно спецификаторы о или х. Например, следующий фрагмент кода
fmt.format("Шестнадцатеричное:
х, восьмеричное о, 196, создает такой вывод.
Шестнадцатеричное: с 4 ,
восьмеричное 3 Вы можете отображать числа с плавающей точкой в шестнадцатеричном формате, используя спецификатора. Формат, создаваемый спецификатором а, на первый взгляд может показаться странным. Дело в том, что его представление использует форму, подобную научной нотации, состоящей из мантиссы и экспоненты, обе — в шестнадцатеричном формате. Вот как выглядит общий формат x 1
. s i g p e x Здесь s i g содержит дробную часть мантиссы, а в х р — экспоненту. Символ р указывает начало экспоненты. Например, следующий вызов метода а " ,
создает такой вывод x 1 Форматирование времени и даты
Одно из наиболее мощных преобразований задается с помощью спецификатора формата %t. Он позволяет форматировать информацию о времени и дате

5 7 Часть II. Библиотека Спецификатор %t работает несколько иначе, чем другие, поскольку требует применения суффиксов для описания частичного или точного формата времени и даты. Суффиксы перечислены в табл. 18.13. Например, чтобы отобразить минуты, следует использовать спецификатор
%tM, где М означает минуты в двухсим­
вольном поле. Аргументы, относящиеся к спецификатору %t, должны иметь тип
Calendar, Date, Long или Таблица 18.13. Суффиксы формата времени и даты
Суффикс.
. , Заменяется на
. .
,
_ , '
< ^ , , >! ^
а
Сокращенное название дня недели
А
Полное название дня недели Сокращенное название месяца
В
Полное название месяца с
Стандартная строка даты и времени, отформатированная как день месяц дата ч ч : мм с с пояс год iСПервые два знака года День месяца как десятичное число (месяц день/год е
День месяца как десятичное число (1-31)
F
год-месяц-день Сокращенное название месяца
Н
Часы (от 00 до Часы (от 01 до День года как десятичное число (от 001 до 366)
к
Часы (от 0 до Часы (от 1 до Миллисекунды (от 000 до Месяц как десятичное число (от 01 до 13)
М
Минуты как десятичное число (от 00 до Наносекунды (от 000000000 до 999999999)
Р
Локальный эквивалент AM или РМ в нижнем регистре
Q
Миллисекунды, прошедшие с 01/01/1970
г
ч ч : мм (часовой формат)
R
ч ч : мм (часовой формат)
S
Секунды (от 00 до Секунды, прошедшие с 1 /1 9 7 0 UTC
Т
чч мм с с (часовой формат)
У
Годы в десятичных числах без века (от 00 до Годы в десятичных числах, включая век (от 0001 до Смещение от Наименование часового пояса
Глава 18. Пакет java.util: прочие служебные классы
5 7 Ниже приведена программа, демонстрирующая применение некоторых форматов Форматирования времени и даты
import java.util.*;
class TimeDateFormat {
public static voi d ma i n ( S t r i n g a r g s []) {
Formatt er fmt = new F o r m a t t e r ();
Calendar cal = C a l e n d a r .g e t l n s t a n c e ();
// Отобразить стандартный 1 2 -часовой формат
f m t .f o r m a t ("% t r " , cal);
S y s t e m . o u t . p r i n t l n (f m t );
// Отобразить полную информацию о дате и времени
fmt = new Formatter!);
f m t .f o r m a t ("% t c " ,
cal);
S y s t e m . o u t .p r i n t l n (f m t );
// Отобразить только часы и минуты = n e w Formatter!);
f m t .f o r m a t ("% t l :% t M " ,
cal, cal);
S y s t e m . o u t . p r i n t l n (f m t );
// Отобразить название и номер месяца
fmt = new Formatter!);
f m t .f o r m a t ("%tB %tb %tm" ,
cal, cal, cal);
S y s t e m . o u t . p r i n t l n (f m t );
f m t .c l o s e (Рассмотрим пример вывода AM
Mon Jan 01 09:17:15 CST 2007
9:17
January Jan Спецификаторы
%n
и Спецификаторы формата %n и %% отличаются от других тем, что они не соответствуют аргументу. Вместо этого они просто представляют собой управляющие последовательности, которые вставляют символ в выходную последовательность. Спецификатор п вставляет перевод строки, а спецификатор %% — знак процента. Ни один из этих символов не может быть введен непосредственно в форматирующую строку. Конечно, вы можете также использовать стандартную управляющую последовательность п , чтобы вставить знак перевода строки.
Ниже приведен пример, демонстрирующий использование спецификаторов формата пи Демонстрация применения спецификаторов формата пи) {

Formatter fmt = new Formatter!);
f m t .f o r m a t (Копирование файла пПеремещение на %d%% завершено 8
);

5 7 2 Часть II. Библиотека Java
S y s t e m . o u t . p r i n t l n (f m t ) ;
f m t .c l o s e (Программа отображает следующий вывод.
Копирование файла Перемещение на 88% завершено
Указание минимальной ширины поля
Целое число, помещенное между символом % и кодом преобразования формата, выступает в качестве спецификатора минимальной ширины, который дополняет вывод пробелами, чтобы обеспечивать заданную минимальную длину. Если строка или число получаются длиннее этого заданного минимума, они будут напечатаны полностью. По умолчанию дополнение осуществляется пробелами. Если вы хотите дополнять нулями, поместите 0 перед спецификатором ширины поля. Например, %05d дополнит число, состоящее из менее чем 5 разрядов, нулями — чтобы его общая ширина была равна пяти. Спецификатор ширины поля может применяться вместе со всеми спецификаторами формата, кроме %п.
В следующей программе демонстрируется использование спецификаторами нимальной ширины поля за счет добавления его к спецификатору преобразования
% f
// Демонстрация применения спецификатора ширины поля
import java.util.*;
class FormatDemo4 {
public static vo id ma in ( St r in g a r g s []) {
Formatter fmt = ne w F o r m a t t e r ();
f m t .f o r m a t ( " I
% fI%nI%12 f I % n I % 0 1 2 f I ",
10 .12345 ,
10.12345, 10.12345);
S y s t e m . o u t . p r i n t l n (f m t );
*
f m t .c l o s e (Эта программа создает следующий вывод
I
10.1234501
I
0 0 0 1 0 . 1 2 3 4 5 0 Первая строка отображает число 10,12345 с шириной по умолчанию. Вторая выводит это значение в символьном поле. Третья строка отображает значение в символьном поле, дополняя его предваряющими нулями.
Минимальный модификатор ширины поля часто используется для создания таблиц, состоящих из строки столбцов. Например, следующая программа выдает таблицу квадратов и кубов чисел от 1 до 10.
// Создает таблицу квадратов и кубов
import java.util.*;
class Fie ldW idt hDe mo {
public static vo id m ai n( S tr i ng args[]) {
Formatter fmt;
Глава 18. Пакет java.util: прочие служебные классы 7 3
for(int i=l; i <= 10; i++) {
fmt = new Formatter();
f m t .format("%4d %4d %4d",
i, i*i, i*i*i);
System.out.pri n t l n (fmt);
fm t .c l o s e (Ее вывод показан ниже.
1
1
1
2
4
8
3
9
27
4
16
64
5
25
125
6
36
216
7
49
343
8
64
512
9
81
729
10
100
1000
Указание точности
Спецификатор точности может быть применим к спецификаторам формата % f , е, %g и %s. Он следует за спецификатором минимальной ширины поля (если таковой имеется) и состоит из точки с последующим целым числом. Его конкретное значение зависит от типа данных, к которому он применяется.
Когда вы применяете спецификатор точности к данным с плавающей точкой с использованием спецификаторов преобразования %f или е, то он определяет количество отображаемых десятичных разрядов. Например,
%10
4f отображает число, по меньшей мере, в 10 символов шириной с четырьмя разрядами после запятой. При использовании спецификатора д точность определяет количество значащих десятичных разрядов. Точность по умолчанию составляет б знаков после запятой.
В применении к строкам спецификатор точности задает максимальную ширину поля. Например, %5 . 7 s отображает строку длиной минимум в пять символов и не превышающей семь символов. Если строка длиннее максимальной ширины, конечные символы будут усечены.
В следующей программе демонстрируется^абота с модификатором точности Демонстрация применения модификатора точности
import java.util.*;
class PrecisionDemo {
public static void main(String a r g s []) {
Formatter fmt = new Formatter();
// Формат с 4 десятичными разрядами
fmt.format("%.4f",
123.1234567);
System.out.println(fmt);
f m t .c l o s e ();
// Формат с 2 десятичными разрядами в символьном поле = new Formatter();
f mt.format("% 1 6 .2 e ", 123.1234567);
System.out.println(fmt);
fmt.close();
// Отобразить максимум 15 символов строки

5 7 Часть II. Библиотека Java
fmt = new Formatter();
fm t Форматировать в Java теперь очень просто
fm t .c l o s e (Ниже представлен вывод этой программы.
123.1235
1.23е+02 Форматировать в

Использование флагов формата
Класс F o r m a t t e r распознает набор флагов формата, которые позволяют вам управлять различными аспектами преобразования. Все флаги формата — одиночные символы, и флаг формата следует за знаком % в спецификаторе формата. Флаги перечислены в табл. Таблица 18.14. Флаги формата

Ф лаг
.Э ф ф ект Выравнивание влево
#
Альтернативный формат преобразования
0
Вывод дополняется нулями вместо пробелов
пробел
Положительным числам предшествует пробел
+
Положительным числам предшествует знак -Числовые значения, включающие групповые разделители
(
Отрицательные числовые значения заключены в скобки
Не все флаги применимы ко всем спецификаторам формата. В следующих разделах они объясняются более подробно.
Выравнивание вывода
По умолчанию весь вывод выравнивается вправо. Иными словами, если ширина поля больше, чем выводимые данные, то эти данные будут размещены в правой части поля. Вы можете выравнивать значения влево, поместив знак минус сразу после %. Например, %-10 . 2 f выравнивает влево число с плавающей точкой с двумя разрядами после десятичной точки в пределах символьного поля. Например, рассмотрим следующую программу Демонстрация выравнивания влево
import java.util.*;
class LeftJustify {
public static void main(String a r g s []) {
Formatter fmt = new Formatter();
// По умолчанию выравнивается вправо
fmt.format("I%10.2fI ", 123.123);
System.out.println(fmt);
fmt.c l o s e ();
Глава 18. Пакет java.util: прочие служебные классы 7 5
// А теперь влево = new Formatter();
f m t .format(" I%-10.2fI", 123.123);
System.out.println(fmt);
f m t .cl o s e (Получим такой результат Как видите, вторая строка выровнена влево в пределах символьного поля.
Флаги пробела, +, 0 и (Чтобы заставить отображать знак + перед положительными числовыми значениями, добавьте флаг +. Например порождает такую строку+ Когда создаются столбцы чисел, иногда удобно выводить пробел перед положительными числами, чтобы положительные и отрицательные значения выводились в столбец. Чтобы достичь этого, добавьте флаг пробела Демонстрация применения пробела в качестве спецификатора формата
import java.util.*;
class FormatDemo5 {
public static void main(String a r g s []) {
Formatter fmt = new Formatter!);
fmt.format("% d " ,
-100);
System.out.println(fmt);
fm t .c l ose();
fmt = new Formatter();
f m t .format("% d" ,
100);
System.out.println(fmt);
fm t .c l o s e ();
fmt = new Formatter();
fm t .format("% d " ,
-2 00);
System.out.println(fmt);
fm t .c l o s e ();
fmt = new Formatter();
fm t .format("% d" ,
2 00);
System.out.println(fmt);
fm t .clo s e (Результат показан ниже- 2 0 0 2 0 0

5 7 Часть II. Библиотека Обратите внимание на то, что положительные значения имеют ведущий пробел, что обеспечивает ровное расположение разрядов в столбце.
Чтобы отобразить отрицательные числовые значения в скобках вместо добавления ведущего минуса, используйте флаг (. Например. format( " % ( d " ,

1 0 0
)
; дает следующий результат 0 Флаг 0 заставляет дополнять вывод нулями вместо пробелов.
Ф лаг “запятая”
При отображении больших чисел зачастую удобно добавлять разделители групп, которыми в англоязычной среде являются запятые. Например, значение
1234567 легче читается, когда оно отформатировано в виде 1,234,567. Для добавления спецификаторов группирования служит флаг запятая ( ,) . Например. format( " % , . 2 f " , 43 567 8 3 4 9 7 . 3 4 ) ; выдает такую строку , 3 5 6 , 7 8 3 , 4 9 7 . 3 Флаг Этот флаг может применяться к спецификаторам ох, е и
% f
. Для спецификаторов е и
% f флаг # обеспечивает наличие десятичной точки даже в случае, если нет дробных разрядов. Если вы перед спецификатором форматах поставите флаг #, то шестнадцатеричное число будет выведено с префиксом Ох. Если предварить флагом # спецификатор х, число будет выводиться сведущим нулем.
Параметры верхнего регистра
Как упоминалось ранее, некоторые спецификаторы формата имеют версии в верхнем регистре, которые заставляют при преобразовании применять буквы верхнего регистра, где это возможно. В табл. 18.15 описывается упомянутый эффект. Например, следующий вызов fmt. format( " % Х " , 2 50 ) ; порождает следующую строку.
РА
Приведенный ниже вызов fmt. format( " % Е " , 1 2 3 . 1 2 3 4 ) дает в результате такую строку . 2 3 1234Е+02
Таблица 18.15. Параметры верхнего регистра
Спецификатор Эффект Г * *
t.: I- 4 * / Г ‘. г :
; ; * I t

Заставляет шестнадцатеричные цифры от
а
до отображаться вверх нем регистре, те. от
А
до Кроме того, префикс Ох отображается как
0Х, ар как
Р

Переводит в верхний регистр значения
t r ue и
fa l se
Глава 18. Пакет java.util: прочие служебные классы 7 Окончание табл. Спецификатор Эффект
Ь

Заставляет символ экспоненты е отображаться в верхнем регистре
%G
Заставляет символ экспоненты е отображаться в верхнем регистре

Заставляет шестнадцатеричные цифры от а
до отображаться вверх нем регистре, от
А
до Переводит соответствующую спецификатору строку в верхний регистр

Заставляет алфавитный вывод отображаться в верхнем регистре

Заставляет шестнадцатеричные цифры от а до f отображаться вверх нем регистре, от
А
до Кроме того, префикс Ох отображается как Х если таковой присутствует
Использование индекса аргументов
Класс F o r m a t t e r включает очень удобное средство, позволяющее указать аргумент, к которому должен применяться конкретный спецификатор формата. Обычно порядок аргументов и спецификаторов формата совпадает — слева направо. То есть первый спецификатор формата относится к первому аргументу, второй — ко второму аргументу и т.д. Однако, используя индекс аргумента, вы можете явно управлять тем, к какому йз аргументов относится спецификатор формата.
Индекс аргумента следует сразу за символом % в спецификаторе формата. Он имеет следующий вид. п$
Здесь п — индекс нужного аргумента, начиная с 1. Рассмотрим следующий пример %l$d %2$d",

1   ...   46   47   48   49   50   51   52   53   ...   90


написать администратору сайта