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

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

В статье «Система ввода и вывода» я уже упоминал о классе System и уточнил, что в этой статье мы узнаем, как с помощью этого замечательного класса, а точнее одной из его конструкций организовать форматный вывод. Вот и настал этот момент)). В пакете java.io есть класс PrintStream, у которого есть два метода форматирования строк и чисел и которыми можно заменить знакомые нам print и println. Эти методы: format и printf, которые эквивалентны друг другу. Наша конструкция для вывода в консоль: System.out является объектом класса PrintStream (прям санта барбара), и поэтому, форматный вывод мы можем организовать с помощью конструкции System.out.printf(String format, Object… args).

Как всегда, без примера ничего не понятно: System.out.printf(«%07d», 7845); Результат: 0007845.

Выражение выше вывело целое число 7845 и добавило впереди три нуля. Выражение «%07d» — это специальный формат, который говорит, что нужно вывести число длинною в 7 символов; недостающие символы нужно заполнить нолями. Вы можете спросить: сколько же это нужно запоминать непонятных кодировок и информации, чтобы пользоваться форматным выводом? На самом деле все не так сложно. Есть определенные правила, по которым форматируют целые числа, дробные и строки.

Давайте разберем правила для написания форматного вывода. В начале ставим знак %, который говорит, что мы начинаем форматировать. Далее идет необязательная конструкция число$, которая указывает на позицию аргумента в списке. 1$ будет означать, что мы обращаемся к первому аргументу. Иногда нам просто нужно разные аргументы вывести по разному. Но когда нужно общее форматирование, данную конструкция можно не указывать. Следующими в нашей конструкция будут идти так называемые флаги. Это символы служат для специального форматирования и тоже являются необязательными. Например флаг «,» устанавливает разделитель тысяч у целых чисел; ^ — результат по центру. С этим флагом нужно указывать ширину поля. Я тут нашел очень крутую картинку с флагами, но она на английском. Как раз будет повод подучить язык, так как английский очень нужен программистам.

Следующий символ, который идет в конструкции форматного вывода: число, которое показывает минимальное количество выводимых символов. Таким символом в примере было число 7. Далее идет .число — ограничение количества выводимых символов. Например, когда Вам надо вывести очень большое дробное число, но Вы не хотите выводить все знаки после запятой. Тоже необязательно. И последний элемент — это конверсия (conversion) — символ, указывающий, какой тип аргумента должен быть отформатирован: целое число (d), дробное (f), строка (s). В целом, конструкция будет выглядеть так: %[argument_index$][flags][width][.precision]conversion.

Предлагаю попробовать вывести число «пи» в удобном для чтения формате использую полученные навыки: 

Код    
  1. public class StringFormating {
  2.  
  3.     public static void main(String[] args) {
  4.         double pi = Math.PI;//стандартная библиотека Math имеет очень много полезных математических плюшек
  5.        
  6.         System.out.println(pi); //3.141592653589793 - некрасивый вывод
  7.        
  8.         System.out.printf("%.2f", pi); //3,14 - очень даже читаемо
  9.  
  10.     }
  11.  
  12. }

 

Предлагаю что-то посложнее:

Код    
  1. public class StringFormating {
  2.  
  3.     public static void main(String[] args) {
  4.         int number = 555;
  5.         double sqrt = Math.sqrt(number);
  6.         System.out.printf("Корень квадратный из числа %1$+6d равен %2$5.3f", number, sqrt);
  7.  
  8.     }
  9.  
  10. }

Результат выполнения:

вывод с флагами

Заметьте смещение первого аргумента на 3 пробела. Длина числа равна 3, но в выводе выставлена 6. Вот его и сместило еще на 3 пробела.

С форматным выводом целых и дробных чисел мы немного поработали. Теперь попробуем «красиво» вывести строки. Для них действуют такие же привила, как и для чисел. Только при выборе символа конверсии необходимо выбрать «s».

Код    
  1. public class StringFormating {
  2.  
  3.     public static void main(String[] args) {
  4.         String strVariable = "Javamaster";
  5.        
  6.         System.out.printf("%.4s", strVariable); //вывод первых 4 символов
  7.         System.out.println();
  8.         System.out.printf("%1$45s", strVariable);//смещение строки
  9.  
  10.     }
  11.  
  12. }

Результат работы:

форматный вывод строк

Есть еще метод класса String, который позволяет сохранять строку в определенном формате. Принцип его работы такой как метода printf:

Код    
  1. public class StringFormating {
  2.  
  3.     public static void main(String[] args) {
  4.         String strVariable = "Javamaster";
  5.        
  6.         String formatedStrVariable = String.format("%.4s", strVariable); //вывод первых 4 символов
  7.         System.out.println(formatedStrVariable); // -> Java
  8.  
  9.     }
  10.  
  11. }

Для организации более серьезного форматного вывода используют класс Formatter, который находится в пакете java.util. С его помощью очень удобно форматировать дату:

Код    
  1. import java.util.Calendar;
  2. import java.util.Formatter;
  3.  
  4. public class StringFormating {
  5.  
  6.     public static void main(String[] args) {
  7.         Calendar calendar = Calendar.getInstance();
  8.        
  9.         Formatter formatter = new Formatter();
  10.        
  11.         System.out.println(formatter.format("%tl:%tM", calendar, calendar));
  12.        
  13.         Formatter formatter2 = new Formatter();
  14.        
  15.         System.out.println(formatter2.format("%tY-%tm-%td", calendar, calendar, calendar));
  16.  
  17.     }
  18.  
  19. }

форматный вывод даты

Вы спросите, как я знаю, какой символ за какой вывод отвечает? Есть специальная документация в которой можно посмотреть как пользоваться тем или иным методом в java. Просто введите в гугле название класса, который Вы хотите использовать и одним из первых результатов будет документация Oracle — владельца языка Java.

результат в гугл

Вот часть документации, где есть полный набор форматируемых символов:

часть документации

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

Это все, что касается темы форматирование строк и чисел. Теперь Вы сможете представлять результаты работы программы в более удобном для чтения формате.

Добавить комментарий