Spec-Zone .ru
спецификации, руководства, описания, API
След: Изучение Языка Java
Урок: Числа и Строки
Раздел: Числа
Форматирование Числового Вывода Печати
Домашняя страница > Изучение Языка Java > Числа и Строки

Форматирование Числового Вывода Печати

Ранее Вы видели использование print и println методы для того, чтобы напечатать строки к стандартному выводу (System.out). Так как все числа могут быть преобразованы в строки (как Вы будете видеть позже в этом уроке), можно использовать эти методы, чтобы распечатать произвольную смесь строк и чисел. У языка программирования Java есть другие методы, однако, которые позволяют Вам осуществлять намного больше контроля своим выводом печати, когда числа включаются.

printf и Методы формата

java.io пакет включает a PrintStream class, у которого есть два метода форматирования, которые можно использовать для замены print и println. Эти методы, format и printf, эквивалентны друг другу. Знакомое System.out то, что Вы использовали, оказывается, a PrintStream объект, таким образом, можно вызвать PrintStream методы на System.out. Таким образом можно использовать format или printf где угодно в Вашем коде, где Вы ранее использовали print или println. Например,

System.out.format(.....);

Синтаксис для этих двух java.io.PrintStream методы являются тем же самым:

public PrintStream format(String format, Object... args)

где format строка, которая определяет форматирование, которое будет использоваться и args список переменных, которые будут напечатаны, используя то форматирование. Простой пример был бы

System.out.format("The value of " + "the float variable is " +
     "%f, while the value of the " + "integer variable is %d, " +
     "and the string is %s", floatVar, intVar, stringVar); 

Первый параметр, format, строка формата, определяющая как объекты во втором параметре, args, должны быть отформатированы. Строка формата содержит простой текст так же как спецификаторы формата, которые являются специальными символами, которые форматируют параметры Object... args. (Нотация Object... args вызывается varargs, что означает, что число параметров может измениться.)

Спецификаторы формата начинаются со знака процента (%) и заканчиваются преобразователем. Преобразователь является символом, указывающим на тип параметра, который будет отформатирован. Промежуточный знак процента (%) и преобразователь у Вас могут быть дополнительные флаги и спецификаторы. Есть много преобразователей, флагов, и спецификаторов, которые документируются в java.util.Formatter

Вот основной пример:

int i = 461012;
System.out.format("The value of i is: %d%n", i);

%d определяет, что единственная переменная является десятичным целым числом. %n независимый от платформы символ новой строки. Вывод:

The value of i is: 461012

printf и format методы перегружаются. У каждого есть версия со следующим синтаксисом:

public PrintStream format(Locale l, String format, Object... args)

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

System.out.format(Locale.FRANCE,
    "The value of the float " + "variable is %f, while the " +
    "value of the integer variable " + "is %d, and the string is %s%n", 
    floatVar, intVar, stringVar); 

Пример

Следующая таблица приводит некоторые из преобразователей и флагов, которые используются в примере программы, TestFormat.java, это следует за таблицей.

Преобразователи и Флаги, Используемые в TestFormat.java
Преобразователь Флаг Объяснение
d   Десятичное целое число.
f   Плавание.
n   Новый знак строки, соответствующий платформе, запускающей приложение. Следует всегда использовать %n, а не \n.
tB   Дата & преобразование времени — специфичное для локали полное имя месяца.
td, te   Дата & преобразование времени — 2-разрядный день месяца. у td есть продвижение, обнуляет как необходимый, te не делает.
ty, tY   Дата & преобразование времени — ty = 2-разрядный год, tY = 4-разрядный год.
tl   Дата & преобразование времени — час в 12-часовых часах.
ТМ   Преобразование даты & времени — минуты в 2 цифрах, с продвижением обнуляет по мере необходимости.
tp   Дата & преобразование времени — специфичный для локали/пополудни (нижний регистр).
ТМ   Преобразование даты & времени — месяцы в 2 цифрах, с продвижением обнуляет по мере необходимости.
tD   Дата & преобразование времени — дата как %tm%td%ty
  08 Восемь символов в width, с продвижением обнуляет по мере необходимости.
  + Включает знак, или положительный или отрицательный.
  , Включает специфичные для локали символы группировки.
  - Лево-выровненный по ширине..
  .3 Три места после десятичной точки.
  10.3 Десять символов в width, выровненном по правому краю, с тремя местами после десятичной точки.

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

import java.util.Calendar;
import java.util.Locale;

public class TestFormat {
    
    public static void main(String[] args) {
      long n = 461012;
      System.out.format("%d%n", n);      //  -->  "461012"
      System.out.format("%08d%n", n);    //  -->  "00461012"
      System.out.format("%+8d%n", n);    //  -->  " +461012"
      System.out.format("%,8d%n", n);    // -->  " 461,012"
      System.out.format("%+,8d%n%n", n); //  -->  "+461,012"
      
      double pi = Math.PI;

      System.out.format("%f%n", pi);       // -->  "3.141593"
      System.out.format("%.3f%n", pi);     // -->  "3.142"
      System.out.format("%10.3f%n", pi);   // -->  "     3.142"
      System.out.format("%-10.3f%n", pi);  // -->  "3.142"
      System.out.format(Locale.FRANCE,
                        "%-10.4f%n%n", pi); // -->  "3,1416"

      Calendar c = Calendar.getInstance();
      System.out.format("%tB %te, %tY%n", c, c, c); // -->  "May 29, 2006"

      System.out.format("%tl:%tM %tp%n", c, c, c);  // -->  "2:34 am"

      System.out.format("%tD%n", c);    // -->  "05/29/06"
    }
}

Отметьте: обсуждение в этом разделе покрывает только основы format и printf методы. Дальнейшая деталь может быть найдена в Basic I/O раздел Существенного следа, в странице "Форматирования".
Используя String.format создать строки покрывается Строками.

Класс DecimalFormat

Можно использовать java.text.DecimalFormat class, чтобы управлять дисплеем начальных и конечных нулей, префиксов и суффиксов, группируя (тысячи) разделителей, и десятичного разделителя. DecimalFormat предлагает большую гибкость в форматировании чисел, но это может сделать Ваш код более сложным.

Пример, который следует, создает a DecimalFormat объект, myFormatter, передавая образец представляют в виде строки к DecimalFormat конструктор. format() метод, который DecimalFormat наследовался от NumberFormat, тогда вызывается myFormatter— это принимает a double оцените как параметр и возвраты отформатированное число в строке:

Вот пример программы, который иллюстрирует использование DecimalFormat:


import java.text.*;

public class DecimalFormatDemo {

   static public void customFormat(String pattern, double value ) {
      DecimalFormat myFormatter = new DecimalFormat(pattern);
      String output = myFormatter.format(value);
      System.out.println(value + "  " + pattern + "  " + output);
   }

   static public void main(String[] args) {

      customFormat("###,###.###", 123456.789);
      customFormat("###.##", 123456.789);
      customFormat("000000.000", 123.78);
      customFormat("$###,###.###", 12345.67);  
   }
}

Вывод:

123456.789  ###,###.###  123,456.789
123456.789  ###.##  123456.79
123.78  000000.000  000123.780
12345.67  $###,###.###  $12,345.67

Следующая таблица объясняет каждую строку вывода.

DecimalFormat.java Вывод
Значение Образец Вывод Объяснение
123456.789 ###,###.### 123,456.789 Знак фунта (#) обозначает цифру, запятая является заполнителем для группирующегося разделителя, и период является заполнителем для десятичного разделителя.
123456.789 ###.## 123456.79 value имеет три цифры направо от десятичной точки, но pattern имеет только два. format метод обрабатывает это, окружая.
123.78 000000.000 000123.780 pattern определяет начальные и конечные нули, потому что 0 символов используются вместо знака фунта (#).
12345.67 $###,###.### $12,345.67 Первый символ в pattern знак доллара ($). Отметьте, что это сразу предшествует крайней левой цифре в отформатированном output.

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Классы Чисел
Следующая страница: Вне Основной Арифметики