Урок 12

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


1. Класс Formatter

Базовой частью поддержки создания форматированного вывода в языке Java служит класс Formatter, включенный в пакет java.util. Он обеспечивает преобразования формата (format conversions) позволяющие выводить числа, строки и время и даты практически в любом понравившемся вам формате.

В классе Formatter объявлен метод format(), который преобразует переданные в него параметры в строку заданного формата и сохраняет в объекте типа Formatter.

Пример 1. Использование класса Formatter

import java.util.Formatter;

public class SimpleFormatString {
    public static void main(String[] args) {
        Formatter f = new Formatter();
        f.format("This %s is about %n%S %c", "book", "java", '8');
        System.out.print(f);
    }
}

где %s называется спецификатором формата.

Пример 2. Использование класса Formatter

import java.util.Formatter;

public class FormatDemo1 {
    public static void main(String[] args) {
        double x = 1000.0 / 3.0;
        System.out.println("Строка без форматирования: " + x);

        Formatter formatter = new Formatter();
        formatter.format("Строка c форматированием: %.2f%n", x);
        formatter.format("Строка c форматированием: %8.2f%n", x);
        formatter.format("Строка c форматированием: %16.2f%n", x);
        System.out.println(formatter);
    }
}

2. Классы PrintStream, PrintWriter и String

Аналогичный метод format() объявлен у классов PrintStream и PrintWriter. System.out это статическая переменная типа PrintStream.

В Java 5 для классов PrintStream и PrintWriter добавлен метод printf(). Методы printf() и format() автоматически использует класс Formatter.

Пример 3. Форматирование с использованием класса PrintStream

public class FormatDemo4 {
    public static void main(String[] args) {
        System.out.printf("Строка c форматированием: %.2f%n", 1000.0 / 3.0);
        System.out.format("%s, в следующем году вам будет %d", "Джон", 23);
    }
}

Класс String содержит метод format(), с помощью которого тоже возможно форматирование.

Пример 4. Форматирование с использованием класса String

public class StringFormatDemo {
    public static void main(String[] args) {
        String str = String.format("Строка c форматированием: %16.2f", 1000.0 / 3.0);
        System.out.println(str);
    }
}

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

%a Шестнадцатеричное значение с плавающей точкой

%b Логическое (булево) значение аргумента

%c Символьное представление аргумента

%d Десятичное целое значение аргумента

%h Хэш-код аргумента

%e Экспоненциальное представление аргумента

%f Десятичное значение с плавающей точкой

%g Выбирает более короткое представление из двух: %е или %f

%o Восьмеричное целое значение аргумента

%n Вставка символа новой строки

%s Строковое представление аргумента

%t Время и дата

%x Шестнадцатеричное целое значение аргумента

%% Вставка знака %

4. Флаги формата

-          Выравнивание влево
#          Изменяет формат преобразования
0          Выводит значение, дополненное нулями вместо пробелов. Применим только к числам.
Пробел         Положительные числа предваряются   пробелом
+         Положительные числа предваряются знаком +. Применим только к числам.
,          Числовые значения включают разделители групп. Применим только к числам.
(           Отрицательные числовые значения заключаются в скобки. Применим только к числам.

Пример 5. Использование флагов

public class FormatterDemo2 {
    public static void main(String[] args) {
        System.out.printf("%,.2f%n", 10000.0 / 3.0);
        System.out.printf("%, (.2f%n", -10000.0 / 3.0);
    }
}

В строке, определяющей формат, может задаваться индекс форматируемого параметра. Индекс должен следовать непосредственно за символом % и завершаться знаком $. 

Пример 6. Использование флагов

public class FormatterDemo3 {
    public static void main(String[] args) {
        System.out.printf("Hello %1$s!%n%1$s, how are you?%n"
                        + "Welcome to the site %2$s",
                "John", "www.site.com");
    }
}

Общий синтаксис можно описать так:

%[аргумент_индекс][флаги][ширина][.точность]символ_преобразования


0 comments
Leave your comment: