Menu

String.format w Javie: printf i specyfikatory formatu

Jak formatować napisy w Javie przez String.format i printf: specyfikatory formatu dla liczb, wyrównanie, miejsca po przecinku, a także bloki tekstowe i metoda formatted.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Dwa sposoby formatowania

Java formatuje napisy na podstawie szablonu zawierającego specyfikatory formatu (miejsca oznaczone %) oraz wartości, które mają w nie trafić. Są dwa punkty wejścia i mają identyczną składnię:

  • String.format(template, values...) zwraca nowy String.
  • System.out.printf(template, values...) od razu wypisuje wynik.

Oba dają ten sam tekst. String.format go zwraca, żeby dało się go zapisać; printf wypisuje go na konsolę. Zwróć uwagę na %n na końcu szablonu printf: to znak nowej linii niezależny od platformy (w napisach formatujących używaj go zamiast \n).

Najczęstsze specyfikatory

Każdy specyfikator zaczyna się od % i kończy literą, która mówi, jakiego rodzaju wartości się spodziewać:

Na co dzień używa się trzech: %s (dowolna wartość, przez jej toString), %d (liczby całkowite) i %f (liczby dziesiętne). Użyj %%, aby wypisać sam znak procentu. Przekazanie złego typu, np. String do %d, rzuca w czasie działania wyjątek IllegalFormatConversionException.

Kontrola miejsc po przecinku

%f domyślnie pokazuje sześć miejsc po przecinku, co rzadko jest tym, czego chcesz. Wstaw .N przed f, żeby ustalić precyzję (wartość jest zaokrąglana):

Dodaj flagę przecinka, żeby duże liczby miały separatory grup cyfr:

Szerokość i wypełnienie

Liczba między % a literą typu ustala minimalną szerokość pola i dopełnia je spacjami, żeby kolumny się wyrównały. Poprzedzające - wyrównuje do lewej; poprzedzające 0 dopełnia liczby zerami:

Dzięki temu sformatowane tabele i wyrównane raporty są czytelne, zwłaszcza gdy wypisujesz każdy wiersz w pętli for:

%-8s wyrównuje imiona do lewej w kolumnie o szerokości 8, a %5d wyrównuje wyniki do prawej w kolumnie o szerokości 5, więc liczby są wyrównane niezależnie od liczby cyfr.

Kolejność argumentów

Domyślnie specyfikatory pobierają wartości od lewej do prawej. Możesz powtórzyć albo przestawić wartość przez N$ (indeks liczony od jedynki), co przydaje się, gdy ta sama wartość występuje dwa razy:

%1$s za każdym razem odnosi się do pierwszego argumentu, więc echo wypisuje się dwa razy.

Metoda formatted()

Od Javy 15 każdy napis ma metodę instancji formatted. To ten sam mechanizm co String.format, tylko zapisany jako wywołanie metody na szablonie:

Szczególnie dobrze łączy się z blokami tekstowymi (wielolinijkowe napisy w potrójnych cudzysłowach) przy budowaniu większych sformatowanych wyników.

Kiedy nie używać String.format

Przy prostym, jednorazowym łączeniu zwykła konkatenacja przez + jest czytelniejsza i szybsza:

String greeting = "Hi, " + name + "!";   // simpler than String.format here

Po String.format / printf sięgaj, gdy potrzebujesz prawdziwego formatowania: stałej liczby miejsc po przecinku, wypełnienia, wyrównania, grupowania cyfr, a nie tylko sklejenia kilku wartości.

Dalej: operatory

Formatowanie zamienia wartości na tekst. Żeby w ogóle obliczyć te wartości, potrzebujesz operatorów Javy: arytmetycznych, porównania i logicznych. O nich jest następna strona.

Najczęściej zadawane pytania

Jak sformatować napis w Javie?

Użyj String.format(template, values...), które zwraca nowy napis, w którym każdy specyfikator formatu jest zastąpiony wartością: String.format("%s is %d", name, age). Aby od razu wypisać wynik zamiast budować napis, użyj System.out.printf(...) z tym samym szablonem. Od Javy 15 możesz też wywołać template.formatted(values...).

Jak sformatować liczbę do dwóch miejsc po przecinku w Javie?

Użyj specyfikatora %.2f: String.format("%.2f", 3.14159) daje "3.14". Liczba po kropce to liczba zachowanych miejsc po przecinku, a wartość jest zaokrąglana. Aby dodać separatory tysięcy, użyj flagi przecinka: %,.2f daje "1,234.57".

Czym różni się String.format od printf w Javie?

Używają dokładnie tych samych specyfikatorów formatu. String.format(...) zwraca sformatowany tekst jako nowy String, który możesz zapisać albo przekazać dalej. System.out.printf(...) zapisuje sformatowany tekst prosto na standardowe wyjście i nie zwraca nic przydatnego. Używaj String.format do budowania napisu, a printf do jego wypisania.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ