Урок J-15

У попередніх уроках для виведення інформації на консоль ми використовували методиprint() іprintln(), які виводили рядки або числа без форматування. Елементарне форматування ми могли реалізувати за допомогою додавання рядків додаткових пробілів або інших символів. У цьому уроці ми познайомимося з методами, які відкриють нові можливості дляформатування рядків у Java.

Спочатку трохи мотивації. Розглянемо приклад, у якому розраховується та виводиться на консоль таблиця множення:

В даному випадку для поділу чисел ми використовували знак табуляції, це дало такий результат:

знаків

Таблиця виглядає рівно, але вона надто широка. Для того, щоб зробити таблицю компактнішою, будемо використовувати методprintf(). Замінимо в попередньому коді рядок

Отримаємо наступний результат:

j-15

Як бачимо, таблиця стала компактніше. Більше того, тепер ми можемо зменшувати чи збільшувати проміжки між числами за нашим бажанням. Для цього потрібно лише замінити число4 у виразі%4d.

Далі розглянемо методprintf() та його можливості докладніше.

Використання printf для форматування в Java

Методprintf() належить класуPrintStream, який відповідає за виведення інформації. Вже знайомі нам методиprint() іprintln() також є методами класуPrintStream.

Методprintf визначений таким чином:

Перший аргументformat це рядок, що визначає шаблон, згідно з яким відбуватиметься форматування. Для її запису існують певні правила.

У попередньому прикладі формат був%4d, деd означає висновок десяткового цілого числа, а4 — означає те, що й кількість знаків у числі менше, ніж 4, воно буде спереду доповнено пробілами на недостатнє (до 4-х) кількість знаків (тим самим посунуто вправо).

Для наочності наведемо ще один приклад, який виводить стовпчиком кілька чисел.

На консоль буде виведено:

Тут у рядку форматування ми використовували кілька разів%6d%n, де кожне%6d задає формат для одного з чисел, зазначених далі як аргументи. Перше%6d форматує число666666, друге%6d форматує55555 і т.д.%n означає переклад рядка. Оскільки до всіх числах було застосовано форматування%6d, то числа, які містять менше 6 знаків, посунуті вправо на недостатню кількість знаків і тим самим красиво вирівняні.

Загальний вигляд інструкції форматування наступний:

Усі можливі прапори та перетворення (conversion ) зазначені в офіційній документації. Тут ми не ставимо за мету вивчити їх усі, наша мета — навчитися застосовувати форматування. Тож розглянемо кілька прикладів.

Приклад 1. Наочний приклад інструкції форматування у її повному вигляді наведено на наступній картинці:

знаків

Якщо ми застосуємо формат з картинки до Pi

Отримаємо наступний результат на консолі:

Розберемо цю інструкцію з кінця:

  • f - вказує на те, що виводимо число з плаваючою точкою.
  • .10 — виведене число міститиме 10 знаків після коми.
  • 20 — всього виведене число матиме ширину 20 символів
  • +0 — символи, що відсутні (до 20-ти), будуть заповнені нулями, перед числом буде вказано знак (+)
  • 1$ — цей формат застосовується до першого аргументу, якийзнаходиться після рядка форматування. У цьому прикладі це було вказувати не обов'язково.

Приклад 2. Розглянемо приклад демонструючий висновок на консольдо знайомства з форматуванням іпісля.

Без форматування

На консоль буде виведено:

У цьому випадку перетворення коду на рядок автоматично генерується компілятором Java. Цей спосіб поганий тим, що при великій кількості змінних та тексту для виведення легко втратити контроль над результатами.

З форматуванням

Де%d відповідає за виведення значення змінноїi, а%f за виведення значення змінноїroot. При цьому ми не використовуємо конкатенацію.

На консоль буде виведено:

Як бачимо, формат автоматично округляє число до 6 знаків після коми. Однак, при форматуванні ми можемо встановлювати таку кількість знаків після коми, яка нам потрібна, наприклад:

Виведе число із двома знаками після коми.

Далі на прикладах розглянемо найпопулярніші правила форматування.

Форматування цілих чисел

Виведення цілого числа

Виведення цілого числа з поділом тисяч

Число менше 7 знаків буде «посунуто» вправо на кількість знаків, що бракує.

Число менше 7 знаків буде доповнено нулями зліва на кількість знаків, що бракує.

Число буде доповнено знаком + і, якщо воно менше 7 знаків, то буде доповнено нулями на кількість знаків, що бракує.

Число буде вирівняне по лівому краю і, якщо воно менше 7 знаків, то буде доповнено пробілами праворуч на брак знаків.

Зрозуміло, замість 7 можна використовувати будь-яке інше позитивне ціле число.

Форматування чисел з плаваючою точкою

Виведення числаe. Автоматичне заокруглення до 6 знаків після коми.

Число менше 10 знаків буде «посунуто» вправо на кількість знаків, що бракує.

Число менше 10 знаків буде доповнено нулями зліва на кількість знаків, що бракує.

Число буде доповнено знаком + і, якщо воно менше 10 знаків, то буде доповнено нулями на кількість знаків, що бракує.

Число буде виведено з 15 знаками після коми.

Число буде виведено з трьома знаками після коми і, якщо воно менше 8 символів, то буде «посунуто» вправо на брак знаків.

Число буде вирівняно по лівому краю, виведено з трьома знаками після коми і, якщо воно менше 8 знаків, то буде доповнено пробілами праворуч на брак знаків.

Форматування рядків

Якщо рядок містить менше 10 символів, то «посунути» її вправо на брак символів.

Рядок буде вирівняно по лівому краю і, якщо воно менше 10 символів, то буде доповнено праворуч пробілами на брак символів.

Виведе перші 3 символи рядка.

Виведе перші 3 символи рядка і посуне їх вправо на кількість символів, що бракує до 8.

Локалізація

У різних країнах деякі записи прийнято робити по-різному. Наприклад, в одних країнах дрібне число прийнято писати з точкою «3.68», а в інших з комою «3,68». Java нам дозволяє дотримуватися цих традицій. Методprintf має ще одну сигнатуру:

printf (Locale l, String format, Object ... args)

Першим аргументом стоїтьLocale l, який визначає локалізацію. Для того, щоб використовувати локалізацію необхідно спочатку файлу з вашим кодом імпортувати бібліотеку java.util.Locale.

Розглянемокілька прикладів застосування:

Залежно від цієї країни використовуються різні роздільники для тисяч.

Залежно від цієї країни використовуються різні роздільники у дробових чисел.

Використання String.format

У випадку, якщо немає необхідності виводити відформатований рядок, а потрібно просто зберегти його для подальшого використання (наприклад, для запису в лог або базу даних) слід використовувати методformat з класуString. Принципи форматування в цьому випадку абсолютно такі ж, як у описаного вищеprintf, але цей метод замість виведення рядка зберігає її як відформатований рядок.

Це далеко не всі можливості форматування Java. Існують кілька класів, призначених для складнішого форматування, але їх залишимо для подальших уроків.

Закінчити урок хочеться прикладом, у якому використовуються форматування всіх вивчених у цьому уроці типів даних: цілих чисел, чисел із плаваючою точкою та рядків.

Приклад: Таблиця курсів валют

Результат виведення на консоль:

Корисні посилання з офіційної документації: