Spec-Zone .ru
спецификации, руководства, описания, API
|
Ранее Вы видели использование print
и println
методы для того, чтобы напечатать строки к стандартному выводу (System.out
). Так как все числа могут быть преобразованы в строки (как Вы будете видеть позже в этом уроке), можно использовать эти методы, чтобы распечатать произвольную смесь строк и чисел. У языка программирования Java есть другие методы, однако, которые позволяют Вам осуществлять намного больше контроля своим выводом печати, когда числа включаются.
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
, это следует за таблицей.
Преобразователь | Флаг | Объяснение |
---|---|---|
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
создать строки покрывается Строками. Можно использовать 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
Следующая таблица объясняет каждую строку вывода.
Значение | Образец | Вывод | Объяснение |
---|---|---|---|
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 . |